home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 2 / Amiga Tools 2.iso / tex / macros / contrib / xy.tex < prev    next >
Encoding:
Text File  |  1995-03-15  |  80.0 KB  |  1,932 lines

  1. %% xy.tex from $Id: xy.doc,v 2.12 1994/10/25 11:55:12 kris Exp $
  2. %%
  3. %% Basic XY-pictures: XY-pic bootstrap and kernel macros.
  4. %% Copyright (c) 1991-1994 Kristoffer H. Rose <kris@diku.dk>
  5. %%
  6. %% This file is part of the XY-pic package for graphs and diagrams in TeX.
  7. %% Copyright (c) 1991-1994 Kristoffer H. Rose <kris@diku.dk>
  8. %%
  9. %% The XY-pic package is free software; you can redistribute it and/or modify
  10. %% it under the terms of the GNU General Public License as published by the
  11. %% Free Software Foundation; either version 2 of the License, or (at your
  12. %% option) any later version.
  13. %%
  14. %% The XY-pic package is distributed in the hope that it will be useful, but
  15. %% WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
  16. %% or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
  17. %% for more details.
  18. %%
  19. %% You should have received a copy of the GNU General Public License along
  20. %% with this package; if not, write to the Free Software Foundation, Inc.,
  21. %% 675 Mass Ave, Cambridge, MA 02139, USA.
  22. %%
  23. \ifx\xyloaded\undefined\else \message{not reloaded}\endinput \fi
  24. \let\xyloaded=\relax
  25. \message{Bootstrap\string'ing\string:}
  26. {\catcode96 12\catcode`\#6\catcode`\.12\catcode`\:12\catcode`\'12\catcode`\@11
  27. \ifx\xywarnifdefined\undefined\else \immediate\write16{}%
  28.  \immediate\write16{%
  29.  XY-pic Warning: \string\xywarnifdefined\space redefined.}%
  30.  \immediate\write16{}\fi
  31. \gdef\xywarnifdefined#1{\ifx#1\undefined\else \immediate\write16{}%
  32.  \immediate\write16{%
  33.  XY-pic Warning: `\string#1' redefined.}\immediate\write16{}\fi}
  34. \xywarnifdefined\xydef@ \gdef\xydef@#1{\xywarnifdefined#1\def#1}
  35. \xywarnifdefined\xylet@ \gdef\xylet@#1{\xywarnifdefined#1\let#1}
  36. \xywarnifdefined\xynew@
  37.  \gdef\xynew@#1#2{\xywarnifdefined#2\csname new#1\endcsname#2}}
  38. \message{catcodes\string,}
  39. \xywarnifdefined\xyuncatcodes \edef\xyuncatcodes{%
  40.  \catcode92 0 \catcode123 1 \catcode125 2 \catcode37 14
  41.  \catcode 9 \the\catcode 9 \catcode10 \the\catcode10 \catcode12 \the\catcode12
  42.  \catcode35 \the\catcode35 \catcode36 \the\catcode36 \catcode38 \the\catcode38 
  43.  \catcode43 \the\catcode43 \catcode45 \the\catcode45 \catcode46 \the\catcode46 
  44.  \catcode47 \the\catcode47 
  45.  \catcode60 \the\catcode60 \catcode61 \the\catcode61 \catcode62 \the\catcode62 
  46.  \catcode64 \the\catcode64 \catcode96 \the\catcode96
  47.  \newlinechar \the\newlinechar \endlinechar \the\endlinechar }
  48. \xywarnifdefined\xycatcodes \def\xycatcodes{%
  49.  \catcode 9 10
  50.  \catcode35 6 \catcode 36 3 \catcode 38 4
  51.  \catcode43 12 \catcode 45 12 \catcode 46 12 \catcode 47 12
  52.  \catcode60 12 \catcode 61 12 \catcode 62 12
  53.  \catcode64 11 \catcode 96 12 }
  54. \xycatcodes
  55. \message{docmode,}
  56. {\catcode`\|0 \xywarnifdefined|DOCMODE
  57. \gdef|DOCMODE#1{\ifx(#1\relax \xycatcodes \expandafter\ignorespaces
  58.  \else \skipspecials@ \expandafter\docm@\fi}%
  59. \xywarnifdefined\skipspecials@
  60. \gdef\skipspecials@{%
  61.  \catcode`\\12 \catcode`\{12 \catcode`\}12 \catcode`\#12 \catcode`\%12
  62.  \catcode`\^^L12 \endlinechar`\^^J }%
  63. \catcode`\/=12 \lccode`\/`\\%
  64. \lccode`\D`\D \lccode`\O`\O \lccode`\C`\C \lccode`\M`\M \lccode`\E`\E
  65. \lowercase{%
  66. \xywarnifdefined\docm@ \gdef\docm@{\docm@i}%
  67. \xywarnifdefined\docm@i \gdef\docm@i#1^^J{\docm@ii#1/DOCMODE\docm@iii}%
  68. \xywarnifdefined\docm@ii
  69.  \gdef\docm@ii#1/DOCMODE{\def\next@{#1}\futurelet\next\docm@iii}%
  70. \xywarnifdefined\docm@iii \gdef\docm@iii#1\docm@iii{%
  71.  \ifx\next\docm@iii \let\next\next@ \docecho@ \let\next@\docm@
  72.  \else\ifx\next@\empty \let\next@\docfinish@
  73.  \else \edef\next@{\noexpand\docm@iv\next@/DOCMODE#1\noexpand\docm@iv}%
  74.  \fi\fi \next@}%
  75. \xywarnifdefined\docm@iv
  76.  \gdef\docm@iv#1/DOCMODE\docm@iv{\def\next{#1}\docecho@ \docm@}}%
  77. \xywarnifdefined\docecho@ \global\let\docecho@\relax
  78. \xywarnifdefined\docfinish@ \gdef\docfinish@{\xyuncatcodes|DOCMODE\next}}
  79. \xydef@\xydefcsname@#1{\DN@{#1}\DNii@##1{%
  80.  \ifx ##1\relax\else \xywarning@{`\string##1\string' redefined.}\fi \def##1}%
  81.  \expandafter\nextii@\csname\codeof\next@\endcsname}
  82. \xydef@\xyletcsnamecsname@#1#2{\def\1{#1}\def\2{#2}\DN@##1##2{%
  83.  \ifx ##1\relax\else \xywarning@{`\string##1\string' redefined.}\fi
  84.  \let##1=##2}%
  85.  \expandafter\expandafter\expandafter\next@
  86.  \expandafter\csname\expandafter\codeof\expandafter\1\expandafter\endcsname
  87.  \csname\codeof\2\endcsname}
  88. \xywarnifdefined\codeof
  89. \xywarnifdefined\codeof@
  90. {\catcode`\:=12 \catcode`\>=12
  91.  \gdef\codeof#1{\expandafter\codeof@\meaning#1<-:}
  92.  \gdef\codeof@#1:->#2<-:{#2}}
  93. \xydef@\charof#1{\expandafter\c@arof@\meaning#1}
  94. \xywarnifdefined\charof@
  95. {\let\1=\gdef \let\2=\catcode \2`\t=12 \2`\h=12 \2`\e=12
  96.  \1\c@arof@ the #1 #2{#2}}
  97. \xydef@\xymakeADD@#1#2 #3 {\ifnum\catcode#3=6 \xydef@#1##1{##1#2#2}%
  98.  \else\xydef@#1##1{##1#2}\fi}
  99. \def\next{\xymakeADD@\addAT@}
  100. \xyuncatcodes
  101. \next @ 64 \catcode 64 11
  102. \xymakeADD@\addHASH@ # 35
  103. \xymakeADD@\addDOLL@ $ 36
  104. \xymakeADD@\addAND@ & 38
  105. \xymakeADD@\addRQ@ ' 39
  106. \xymakeADD@\addPLUS@ + 43
  107. \xymakeADD@\addDASH@ - 45
  108. \xymakeADD@\addDOT@ . 46
  109. \xymakeADD@\addLT@ < 60
  110. \xymakeADD@\addEQ@ = 61
  111. \xymakeADD@\addGT@ > 62
  112. \xymakeADD@\addLQ@ ` 96
  113. \xycatcodes
  114. \input xyidioms
  115. \xydef@\stripRCS$#1${\stripRCS@#1: @@ @@@}
  116. \xydef@\stripRCS@#1: #2@ #3@@@{%
  117.  \ifx @#2\string?\else\ifx :#2\else\stripRCS@@#2\fi\fi}
  118. \xydef@\stripRCS@@#1 #2: @{#1}
  119.  \edef\next{\stripRCS$Revision: 2.12 $}
  120.  \edef\next@{\stripRCS$Locker: $}
  121. \xylet@\xyversion=\next
  122.  \def\next{ @}\ifx\next\next@\else \edef\xyversion{\xyversion.\next@}\fi
  123.  \edef\next{\stripRCS$Date: 1994/10/25 11:55:12 $}
  124. \xylet@\xydate=\next
  125.  \def\next{ @}\ifx\next\next@\else\edef\xydate{\xydate\space(work version)}\fi
  126. \xydef@\XYgreet@{%
  127.  \W@{}%
  128.  \W@{ XY-pic version \xyversion\space<\xydate>}%
  129.  \W@{ Copyright (c) 1991-1994 by Kristoffer H. Rose <kris@diku.dk>}%
  130.  \W@{ XY-pic is free software: see the User\string's Guide for details.}%
  131.  \W@{}}
  132. \XYgreet@
  133. \expandafter\everyjob\expandafter{\the\everyjob\XYgreet@}
  134. \message{Loading kernel:}
  135. \xydef@\XY{\leavevmode
  136.  \hbox{\kern-.1em X\kern-.3em\lower.4ex\hbox{Y\kern-.15em}}}
  137. \xylet@\Xy=\XY
  138. \message{messages;}
  139. \xywarnifdefined\thelineno@
  140. \ifx\inputlineno\undefined \edef\thelineno@{\string?}
  141. \else \def\thelineno@{\the\inputlineno}\fi
  142. \xydef@\xytracelineno@{ \string[\jobname:\thelineno@\string]}
  143. \xydef@\xywarning@#1{{\newlinechar=`\^^J%
  144.  \W@{}\W@{XY-pic Warning: #1\xytracelineno@.}\W@{}}}
  145. \xydef@\xyerror@#1#2{{\DNii@{#2}\newlinechar=`\^^J%
  146.  \ifx\nextii@\empty \errhelp{See the XY-pic manual for further information.}%
  147.  \else \errhelp{#2}\fi
  148.  \errmessage{XY-pic error: #1}}}
  149. \xydef@\xybug@#1{{\newlinechar=`\^^J%
  150.  \errhelp{This is a bug in XY-pic and should not happen!^^J%
  151. If it did then please send a bug report with the offending XY-pic code^^J%
  152. to the author of XY-pic, kris@diku.dk.}%
  153.  \errmessage{XY-pic BUG: #1 -- notify kris@diku.dk.}}}
  154. \message{fonts;}
  155. \xydef@\xyfont@#1{\ifx#1\undefined \DN@{\global\font#1}\expandafter\next@
  156.  \else \xywarning@{Using previously loaded \string#1\space font.}\fi}
  157. \xyfont@\xydashfont=xydash10
  158. \xydef@\xydashl@{\fontdimen6\xydashfont}
  159. \xydef@\xydashh@{\fontdimen5\xydashfont}
  160. \xydef@\xydashw@{\fontdimen8\xydashfont}
  161. \xyfont@\xyatipfont=xyatip10
  162. \xyfont@\xybtipfont=xybtip10
  163. \xyfont@\xybsqlfont=xybsql10
  164. \xydef@\xybsqll@{\fontdimen6\xybsqlfont}
  165. \xydef@\xybsqlh@{\fontdimen5\xybsqlfont}
  166. \xydef@\xybsqlw@{\fontdimen8\xybsqlfont}
  167. \xyfont@\xycircfont=xycirc10
  168. \message{allocations:}
  169. \message{state,}
  170. \xynew@{dimen}\Xc
  171. \xynew@{dimen}\Yc
  172. \xynew@{dimen}\Uc
  173. \xynew@{dimen}\Dc
  174. \xynew@{dimen}\Lc
  175. \xynew@{dimen}\Rc
  176. \xynew@{toks}\Edgec
  177. \xynew@{dimen}\Xp
  178. \xynew@{dimen}\Yp
  179. \xynew@{dimen}\Up
  180. \xynew@{dimen}\Dp
  181. \xynew@{dimen}\Lp
  182. \xynew@{dimen}\Rp
  183. \xynew@{toks}\Edgep
  184. \xynew@{dimen}\Xorigin \Xorigin=\z@
  185. \xynew@{dimen}\Yorigin \Xorigin=\z@
  186. \xynew@{dimen}\Xxbase \Xxbase=1mm
  187. \xynew@{dimen}\Yxbase \Yxbase=\z@
  188. \xynew@{dimen}\Xybase \Xybase=\z@
  189. \xynew@{dimen}\Yybase \Yybase=1mm
  190. \xynew@{dimen}\Xmin
  191. \xynew@{dimen}\Ymin
  192. \xynew@{dimen}\Xmax
  193. \xynew@{dimen}\Ymax
  194. \xynew@{box}\lastobjectbox@
  195. \xynew@{box}\zerodotbox@
  196. \setbox\zerodotbox@=\hbox{\dimen@=.5\xydashw@
  197.  \kern-\dimen@ \vrule width\xydashw@ height\dimen@ depth\dimen@}
  198. \wd\zerodotbox@=\z@ \ht\zerodotbox@=\z@ \dp\zerodotbox@=\z@
  199. \message{direction,}
  200. \xynew@{dimen}\dX
  201. \xynew@{dimen}\dY
  202. \xydef@\sdX{}
  203. \xydef@\sdY{}
  204. \xynew@{count}\K \K=1024
  205. \xynew@{count}\KK@ \KK@=32
  206. \xynew@{count}\Direction
  207. \xynew@{dimen}\K@dXdY
  208. \xynew@{dimen}\K@dYdX
  209. \xydef@\cosDirection{}
  210. \xydef@\sinDirection{}
  211. \xywarnifdefined\DirectionChar
  212. \xywarnifdefined\SemiDirectionChar
  213. \xynew@{read}\xyread@
  214. \xynew@{write}\xywrite@
  215. \xynew@{count}\csp@
  216. \xynew@{dimen}\quotPTK@
  217. \message{utility macros;}
  218. \xydef@\addtotoks@#1{\toks@=\expandafter{\the\toks@#1}}
  219. \xydef@\prependtotoks@#1{%
  220.  \expandafter\def\expandafter\prependtotoks@@\expandafter{\the\toks@}%
  221.  \toks@=\expandafter\expandafter\expandafter{%
  222.  \expandafter\prependtotoks@@\the\toks@}}
  223. \xylet@\prependtotoks@@=\relax
  224. \xydef@\xyinputorelse@#1#2{\openin\xyread@=#1
  225.  \ifeof\xyread@ \DN@{#2}\else \DN@{\closein\xyread@\input#1 }\fi \next@}
  226. \global\csp@=\z@
  227. \xydef@\enter@#1{\global\advance\csp@\@ne
  228.  \expandafter\xdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
  229. \xydef@\nter@#1{\global\advance\csp@\@ne
  230.  \expandafter\gdef\csname cs@\number\csp@\endcsname{#1}\ignorespaces}
  231. \xydef@\dontleave@{\csname cs@\number\csp@\endcsname}
  232. \xydef@\unenter@{\global\advance\csp@\m@ne}
  233. \xydef@\leave@{\expandafter\unenter@\csname cs@\number\csp@\endcsname}
  234. \quotPTK@=\p@ \divide\quotPTK@\K
  235. \xylet@\quotsign@@=\empty
  236. \xywarnifdefined\removePT@
  237. {\catcode`p=12 \catcode`t=12 \gdef\removePT@#1pt{#1}}
  238. \xydef@\quotient@#1#2#3{\A@=#2\relax \B@=#3\relax
  239.  \ifdim\A@<\z@\def\quotsign@@{-}\else\def\quotsign@@{+}\fi
  240.  \ifdim\quotsign@@\A@<15pt \multiply\A@\K
  241.  \else\ifdim\quotsign@@\A@<511pt \multiply\A@\KK@ \divide\B@\KK@
  242.  \else \divide\B@\K \fi\fi
  243.  \ifdim\ifdim\B@<\z@-\fi\B@<\quotPTK@ \xywarning@{division overflow}%
  244.  \else \advance\A@.5\B@ \divide\A@\B@ \fi
  245.  \multiply\A@\quotPTK@ \edef#1{\expandafter\removePT@\the\A@}}
  246. \xydef@\quotient@@#1#2#3{\A@=#2\relax \B@=#3\relax
  247.  \multiply\A@\KK@ \divide\B@\KK@ \divide\B@ 8
  248.  \ifdim\B@=\z@\else \advance\A@.5\B@ \divide\A@\B@ \fi
  249.  \B@=.125\quotPTK@ \multiply\A@\B@ \edef#1{\expandafter\removePT@\the\A@}}
  250. \xydef@\loop@#1\repeat@{\def\body@{#1}\iterate@}\xylet@\repeat@=\fi
  251. \xydef@\iterate@{\body@\expandafter\iterate@\else\fi}
  252. \xydef@\xyinitial@#1#2{\DN@{#1}%
  253.  \xyerror@{XY-pic command used out of context: \codeof\next@}{}}
  254. \xylet@\xy@=\xyinitial@
  255. \xylet@\oxy@=\xy@
  256. \xydef@\inxy@{T\ifx\xy@\xyinitial@ F\else T\fi}
  257. \xydef@\xyxy@@ix@{\begingroup
  258.  \xyuncatcodes\afterassignment\endgroup\global\toks9=}
  259. \xydef@\xy@@{\xy@{}}
  260. \xydef@\plainxy@{\let\xy@=\xyxy@ \let\oxy@=\xy@ \let\xy@@ix@=\xyxy@@ix@}
  261. \message{pictures: \string\xy,}
  262. \xydef@\xy{\hbox\bgroup \aftergroup\xycheck@end
  263.  \setboxz@h\bgroup
  264.  \plainxy@
  265.  \Xc=\z@ \Yc=\z@ \czeroEdge@
  266.  \Xp=\z@ \Yp=\z@ \Up=\z@ \Dp=\z@ \Lp=\z@ \Rp=\z@ \Edgep={\zeroEdge}%
  267.  \Xmin=\hsize \Xmax=-\hsize \Ymin=\hsize \Ymax=-\hsize
  268.  \POS}
  269. \xydef@\czeroEdge@{\Uc=\z@ \Dc=\Uc \Lc=\Uc \Rc=\Uc \Edgec={\zeroEdge}}
  270. \xydef@\xyxy@#1#2{#2}
  271. \xydef@\endxy{\relax
  272.  \dimen@=\Ymax \advance\dimen@-\Ymin
  273.  \ifdim\dimen@<\z@ \dimen@=\z@ \Ymin=\z@ \Ymax=\z@ \fi
  274.  \dimen@=\Xmax \advance\dimen@-\Xmin
  275.  \ifdim\dimen@<\z@ \dimen@=\z@ \Xmin=\z@ \Xmax=\z@ \fi
  276.  \edef\tmp@{\egroup
  277.  \setboxz@h{\kern-\the\Xmin\boxz@}%
  278.  \ht\z@=\the\Ymax \dp\z@=-\the\Ymin \wdz@=\the\dimen@ \boxz@
  279.  \egroup \noexpand\xy@end
  280.  \Uc=\the\Ymax \Dc=-\the\Ymin \Lc=-\the\Xmin \Rc=\the\Xmax}\tmp@}
  281. \xydef@\xycheck@end{\xyFN@\xycheck@end@}
  282. \xydef@\xycheck@end@{\ifx\next\xy@end\DN@\xy@end{}\else\DN@{\xy@end}\fi\next@}
  283. \xydef@\xy@end{%
  284.  \xyerror@{An \string\xy\space environment is not closed correctly.}%
  285.  {I expected \string\endxy. You probably have an umatched {} grouping.}}
  286. \message{positions,}
  287. \xydef@\POS{\afterPOS{}}
  288. \xydef@\afterPOS#1{%
  289.  \DN@##1{\def\afterPOS@{\def\afterPOS@{##1}#1}}%
  290.  \expandafter\next@\expandafter{\afterPOS@}%
  291.  \afterCOORD{\xyFN@\POS@}}
  292. \xylet@\afterPOS@=\empty
  293. \xydef@\afterCOORD#1{%
  294.  \DN@##1{\def\afterCOORD@{\def\afterCOORD@{##1}#1}}%
  295.  \expandafter\next@\expandafter{\afterCOORD@}%
  296.  \afterVECTORorEMPTY{\xy@@\czeroEdge@ \afterCOORD@}{\xyFN@\COORD@}}
  297. \xylet@\afterCOORD@=\empty
  298. \xydef@\afterVECTORorEMPTY#1#2{%
  299.  \DN@##1{\def\afterVECTOR@{\def\afterVECTOR@{##1}%
  300.  \ifVECTORempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
  301.  \expandafter\next@\expandafter{\afterVECTOR@}%
  302.  \xyFN@\VECTOR@}
  303. \xynew@{if}\ifVECTORempty@
  304. \xylet@\afterVECTOR@=\empty
  305. \xydef@\xyVECTOR@{%
  306.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\VECTOR@}%
  307.  \else \ifcat A\noexpand\next \let\next@=\VECTOR@letter
  308.  \else \let\next@=\VECTOR@other \fi\fi \next@}
  309. \xylet@\VECTOR@=\xyVECTOR@
  310. \xydef@\VECTOR@letter{%
  311.  \ifx a\next \expandafter\VECTOR@a \else \expandafter\CORNER@ \fi}
  312. \xydef@\VECTOR@a a(#1){\xy@{a(#1)}{\vfromcartesianangle@{#1}}%
  313.  \VECTORempty@false \afterVECTOR@}
  314. \xydef@\CORNER@{%
  315.  \xy@{}{\A@=-.5\Lc \advance\A@.5\Rc \B@=-.5\Dc \advance\B@.5\Uc
  316.  \let\nextii@=\zeroit@}%
  317.  \VECTORempty@true\CORNER@i}
  318. \xydef@\zeroit@#1{#1=\z@}
  319. \xydef@\CORNER@i{%
  320.  \ifx D\next \DN@ D{\xy@{D}{\Yc=-\Dc \nextii@\Xc \B@=\Yc}\CORNER@ii}%
  321.  \else\ifx U\next \DN@ U{\xy@{U}{\Yc= \Uc \nextii@\Xc \B@=\Yc}\CORNER@ii}%
  322.  \else\ifx L\next \DN@ L{\xy@{L}{\Xc=-\Lc \nextii@\Yc \A@=\Xc}\CORNER@ii}%
  323.  \else\ifx R\next \DN@ R{\xy@{R}{\Xc= \Rc \nextii@\Yc \A@=\Xc}\CORNER@ii}%
  324.  \else\ifx C\next \DN@ C{\xy@{C}{\Xc= \A@ \Yc= \B@}\CORNER@ii}%
  325.  \else\ifx E\next \DN@ E{\xy@{E}{%
  326.  \A@=\Xc \B@=\Yc \the\Edgec\z@ \advance\Xc-\A@ \advance\Yc-\B@}\CORNER@ii}%
  327.  \else\ifx P\next \DN@ P{\xy@{P}{%
  328.  \A@=\Xc \B@=\Yc \the\Edgec\thr@@ \advance\Xc-\A@ \advance\Yc-\B@}%
  329.  \CORNER@ii}%
  330.  \else\ifx (\next
  331.  \DN@(##1){\xy@{(##1)}{\Xc=##1\Xc \Yc=##1\Yc}\afterVECTOR@}%
  332.  \else \let\next@=\afterVECTOR@
  333.  \fi\fi\fi\fi\fi\fi\fi\fi \next@}
  334. \xydef@\CORNER@ii{\xy@@{\let\nextii@=\eat@}%
  335.  \VECTORempty@false \xyFN@\CORNER@i}
  336. \xydef@\VECTOR@other{%
  337.  \addLT@\ifx \next
  338.  \addGT@{\addLT@\DN@##1}{%
  339.  \xy@{<##1>}{\vfromabsolute@{##1}}\VECTORempty@false\afterVECTOR@}%
  340.  \else\ifx (\next
  341.  \DN@(##1){%
  342.  \xy@{(##1)}{\vfromcartesian@{##1}}\VECTORempty@false\afterVECTOR@}%
  343.  \else\ifx /\next
  344.  \DN@/##1/{\xy@{/##1/}{\vfromslide@{##1}}%
  345.  \VECTORempty@false\afterVECTOR@}%
  346.  \else\ifx 0\next
  347.  \DN@ 0{\xy@{0}{\Xc=\z@ \Yc=\z@}\VECTORempty@false\afterVECTOR@}%
  348.  \else
  349.  \DN@{\VECTORempty@true\afterVECTOR@}%
  350.  \fi\fi\fi\fi \next@}
  351. \xydef@\xyCOORD@{%
  352.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\COORD@}%
  353.  \else \ifcat A\noexpand\next \let\next@=\xyCOORD@letter
  354.  \else \let\next@=\xyCOORD@other \fi\fi \next@}
  355. \xylet@\COORD@=\xyCOORD@
  356. \xydef@\xyCOORD@letter{%
  357.  \ifx c\next
  358.  \DN@ c{\xy@{c}{}\afterCOORD@}%
  359.  \else\ifx p\next
  360.  \DN@ p{\xy@{p}\cfromp@ \afterCOORD@}%
  361.  \else\ifx x\next
  362.  \DN@ x{\xy@{x}{\Rc=\Xxbase \Uc=\Yxbase \intersect@}\afterCOORD@}%
  363.  \else\ifx y\next
  364.  \DN@ y{\xy@{y}{\Rc=\Xybase \Uc=\Yybase \intersect@}\afterCOORD@}%
  365.  \else\ifx s\next
  366.  \DN@ s##1{\xy@{s{##1}}{\cfroms@{##1}}\afterCOORD@}%
  367.  \else \let\next@=\afterCOORD@ \fi\fi\fi\fi\fi \next@}
  368. \xydef@\xyCOORD@other{%
  369.  \ifx "\next
  370.  \DN@"##1"{\xy@{"##1"}{\cfromid@{##1}}\afterCOORD@}%
  371.  \else\ifx \bgroup\next
  372.  \DN@##1{\xy@{{##1}}{\enter@{\pfromthep@\basefromthebase@}}%
  373.  \POS##1\relax \xy@@\leave@ \afterCOORD@}%
  374.  \else \let\next@=\afterCOORD@ \fi\fi \next@}
  375. \xydef@\xyPOS@{%
  376.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\POS@}%
  377.  \else\addPLUS@\ifx \next
  378.  \addPLUS@\DN@{\xy@+{\enter@\cplusthec@}%
  379.  \afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
  380.  \else\addDASH@\ifx \next
  381.  \addDASH@\DN@{\xy@-{\enter@\cplusthec@}%
  382.  \afterCOORD{\xy@@{\Xc=-\Xc \Yc=-\Yc\leave@}\xyFN@\POS@}}%
  383.  \else\ifx !\next
  384.  \DN@ !{\xy@!{\enter@\cskewthec@}\afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
  385.  \else\addDOT@\ifx \next
  386.  \addDOT@\DN@{\xy@.{\enter@\cmergethec@}%
  387.  \afterCOORD{\xy@@\leave@ \xyFN@\POS@}}%
  388.  \else\ifx ,\next
  389.  \DN@ ,{\xy@,{}\afterCOORD{\xyFN@\POS@}}%
  390.  \else\ifx ;\next
  391.  \DN@ ;{\xy@;{\swap@}\afterCOORD{\xyFN@\POS@}}%
  392.  \else\ifx :\next
  393.  \DN@ :{\xyFN@\oneortwocolons@}%
  394.  \else\addEQ@\ifx \next
  395.  \addEQ@\DN@{\xyFN@\saveid@}%
  396.  \else\ifx *\next
  397.  \DN@ *{\xyFN@\oneortwostars@}%
  398.  \else \ifx ?\next
  399.  \DN@?{\xy@?{}\afterPLACE{\xyFN@\POS@}}%
  400.  \else \addAT@\ifx \next
  401.  \addAT@\DN@{\xyFN@\STACK@}%
  402.  \else
  403.  \let\next@=\afterPOS@
  404.  \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
  405. \xylet@\POS@=\xyPOS@
  406. \xydef@\oneortwocolons@{\DNii@{\afterCOORD{\xyFN@\POS@}}%
  407.  \ifx :\next \xy@{::}{\setbase@@\Xc\Yc}\DN@:{\nextii@}%
  408.  \else \xy@:{\setbase@\Xp\Yp\Xc\Yc}\let\next@=\nextii@ \fi
  409.  \next@}
  410. \xydef@\oneortwostars@{%
  411.  \ifx *\next
  412.  \DN@*##1##{\nextii@{##1}}%
  413.  \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
  414.  \xy@{**##1{##2}}{\expandafter\connect@\the\toks9}\xyFN@\POS@}%
  415.  \else
  416.  \DN@##1##{\nextii@{##1}}%
  417.  \DNii@##1##2{\xy@@ix@{{##1}{##2}}%
  418.  \xy@{*##1{##2}}{\expandafter\drop@\the\toks9}\xyFN@\POS@}%
  419.  \fi
  420.  \next@}
  421. \xydef@\cfromp@{\Xc=\Xp \Yc=\Yp \Uc=\Up \Dc=\Dp \Lc=\Lp \Rc=\Rp
  422.  \Edgec=\expandafter{\the\Edgep}}
  423. \xydef@\pfromc@{\Xp=\Xc \Yp=\Yc \Up=\Uc \Dp=\Dc \Lp=\Lc \Rp=\Rc
  424.  \Edgep=\expandafter{\the\Edgec}}
  425. \xydef@\swapdimen@#1#2{\dimen@=#1\relax #1=#2\relax #2=\dimen@}
  426. \xydef@\swap@{\swapdimen@\Xc\Xp \swapdimen@\Yc\Yp
  427.  \swapdimen@\Uc\Up \swapdimen@\Dc\Dp \swapdimen@\Lc\Lp \swapdimen@\Rc\Rp
  428.  \toks@=\Edgec \Edgec=\Edgep \Edgep=\toks@}
  429. \xydef@\vfromabsolute@#1{\vfromabsolute@@#1,@}
  430. \xydef@\vfromabsolute@@#1,#2@{\Xc=#1\relax
  431.  \DN@{#2}\ifx\next@\empty \Yc=\Xc
  432.  \else \DN@##1,{\Yc=##1}\next@#2\relax \fi}
  433. \xydef@\cfromthec@{\Xc=\the\Xc \Yc=\the\Yc
  434.  \Uc=\the\Uc \Dc=\the\Dc \Lc=\the\Lc \Rc=\the\Rc
  435.  \Edgec={\expandafter\noexpand\the\Edgec}}
  436. \xydef@\cfromthep@{\Xc=\the\Xp \Yc=\the\Yp
  437.  \Uc=\the\Up \Dc=\the\Dp \Lc=\the\Lp \Rc=\the\Rp
  438.  \Edgec={\expandafter\noexpand\the\Edgep}}
  439. \xydef@\pfromthep@{\Xp=\the\Xp \Yp=\the\Yp
  440.  \Up=\the\Up \Dp=\the\Dp \Lp=\the\Lp \Rp=\the\Rp
  441.  \Edgep={\expandafter\noexpand\the\Edgep}}
  442. \xydef@\pfromthec@{\Xp=\the\Xc \Yp=\the\Yc
  443.  \Up=\the\Uc \Dp=\the\Dc \Lp=\the\Lc \Rp=\the\Rc
  444.  \Edgep={\expandafter\noexpand\the\Edgec}}
  445. \xydef@\cplusthec@{\advance\Xc\the\Xc \advance\Yc\the\Yc}
  446. \xydef@\cskewthec@{%
  447.  \noexpand\cskew@{\the\Yc}{\the\Xc}{\the\Dc}{\the\Uc}{\the\Lc}{\the\Rc}}
  448. \xydef@\cskew@#1#2#3#4#5#6{%
  449.  \Dc=#3\advance\Dc \Yc \ifdim\Dc<\z@ \Dc=\z@ \fi
  450.  \Uc=#4\advance\Uc-\Yc \ifdim\Uc<\z@ \Uc=\z@ \fi
  451.  \advance\Yc#1%
  452.  \Lc=#5\advance\Lc \Xc \ifdim\Lc<\z@ \Lc=\z@ \fi
  453.  \Rc=#6\advance\Rc-\Xc \ifdim\Rc<\z@ \Rc=\z@ \fi
  454.  \advance\Xc#2%
  455.  \Edgec={\rectangleEdge}}
  456. \xydef@\cmergethec@{%
  457.  \noexpand\cmerge@{\the\Yc}{\the\Xc}{\the\Dc}{\the\Uc}{\the\Lc}{\the\Rc}}
  458. \xydef@\cmerge@#1#2#3#4#5#6{\the\Edgec4%
  459.  \A@=#2\advance\A@-\Xc \B@=#1\advance\B@-\Yc
  460.  \dimen@=#5\advance\Lc \A@ \ifdim\Lc<\dimen@ \Lc=\dimen@ \fi
  461.  \dimen@=#6\advance\Rc-\A@ \ifdim\Rc<\dimen@ \Rc=\dimen@ \fi
  462.  \dimen@=#3\advance\Dc \B@ \ifdim\Dc<\dimen@ \Dc=\dimen@ \fi
  463.  \dimen@=#4\advance\Uc-\B@ \ifdim\Uc<\dimen@ \Uc=\dimen@ \fi
  464.  \advance\Xc\A@ \advance\Yc\B@}
  465. \xydef@\halfroottwo{.70710678}
  466. \xydef@\halfrootthree{.8660254}
  467. \xydef@\vfromcartesian@#1{\vfromcartesian@@#1@}
  468. \xydef@\vfromcartesian@@#1,#2@{%
  469.  \Xc=\Xorigin \advance\Xc#1\Xxbase \advance\Xc#2\Xybase
  470.  \Yc=\Yorigin \advance\Yc#1\Yxbase \advance\Yc#2\Yybase}
  471. \xydef@\setbase@#1#2#3#4{%
  472.  \Xorigin=#1\relax \Yorigin=#2\relax
  473.  \Xxbase=#3\relax \advance\Xxbase-\Xorigin
  474.  \Yxbase=#4\relax \advance\Yxbase-\Yorigin
  475.  \Xybase=-\Yxbase \Yybase=\Xxbase}
  476. \xydef@\setbase@@#1#2{%
  477.  \Xybase=#1\relax \advance\Xybase-\Xorigin
  478.  \Yybase=#2\relax \advance\Yybase-\Yorigin}
  479. \xydef@\basefromthebase@{\Xorigin=\the\Xorigin \Yorigin=\the\Yorigin
  480.  \Xxbase=\the\Xxbase \Yxbase=\the\Yxbase
  481.  \Xybase=\the\Xybase \Yybase=\the\Yybase}
  482. \xydef@\vfromcartesianangle@#1{\enter@\basefromthebase@ \R@=#1\p@
  483.  \B@=360\p@
  484.  \loop@ \ifdim\R@<\z@ \advance\R@\B@ \repeat@
  485.  \loop@ \ifdim\R@>\B@ \advance\R@-\B@ \repeat@
  486.  \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
  487.  \Xybase=-\Xybase \Yybase=-\Yybase \fi
  488.  \B@=180\p@
  489.  \ifdim\R@<.5\B@\else \R@=-\R@ \advance\R@\B@
  490.  \Xxbase=-\Xxbase \Yxbase=-\Yxbase \fi
  491.  \B@=90\p@
  492.  \ifdim\R@<.5\B@ \let\nextiii@=\literal@
  493.  \else \R@=-\R@ \advance\R@\B@ \def\nextiii@##1,##2@{##2,##1@}\fi
  494.  \dimen@=\z@ \DN@{1,0@}%
  495.  \dimen@ii=45\p@ \DNii@{.70710678,.70710678@}%
  496.  \chooseangleinterval@
  497.  {\chooseangleinterval@
  498.  {\chooseangleinterval@
  499.  {\chooseangleinterval@
  500.  {\chooseangleinterval@
  501.  {}%
  502.  {4.090909}{.99677570,.08023846@}%
  503.  {}}%
  504.  {6}{.99677570,.08023846@}%
  505.  {\chooseangleinterval@
  506.  {}%
  507.  {8.181818}{.98982144,.14231484@}%
  508.  {}}}%
  509.  {10}{.98480775,.17364818@}%
  510.  {\chooseangleinterval@
  511.  {}%
  512.  {12.857143}{.97492791,.22252093@}%
  513.  {}}}%
  514.  {15}{.96592583,.25881905@}%
  515.  {\chooseangleinterval@
  516.  {\chooseangleinterval@
  517.  {}%
  518.  {16.363636}{.95949297,.28173256@}%
  519.  {}}%
  520.  {18}{.95105652,.30901699@}%
  521.  {\chooseangleinterval@
  522.  {}%
  523.  {20}{.93969262,.34202014@}%
  524.  {}}}}%
  525.  {22.5}{.92387953,.38268343@}%
  526.  {\chooseangleinterval@
  527.  {\chooseangleinterval@
  528.  {\chooseangleinterval@
  529.  {}%
  530.  {24.545455}{.90963200,.41541501@}%
  531.  {}}%
  532.  {25.714286}{.90096887,.43388374@}%
  533.  {}}%
  534.  {30}{.86602540,.5@}%
  535.  {\chooseangleinterval@
  536.  {\chooseangleinterval@
  537.  {}%
  538.  {32.727273}{.84125353,.54064082@}%
  539.  {}}%
  540.  {36}{.80901699,.58778525@}%
  541.  {\chooseangleinterval@
  542.  {\chooseangleinterval@
  543.  {}%
  544.  {38.571429}{.78183148,.62348980@}%
  545.  {}}%
  546.  {40.909091}{.75574957,.65486073@}%
  547.  {\chooseangleinterval@
  548.  {}%
  549.  {40}{.76604444,.64278761@}%
  550.  {}}}}}%
  551.  \A@=\R@ \advance\A@-\dimen@
  552.  \ifdim\ifdim\A@<\z@-\fi\A@<.01\p@ \edef\next@{\expandafter\nextiii@\next@}%
  553.  \else \B@=\dimen@ii \advance\B@-\R@ 
  554.  \ifdim\A@<\B@ \dimen@=\toradians@\A@
  555.  \edef\next@{\next@ \expandafter\removePT@\the\dimen@ @}%
  556.  \else \dimen@=-\toradians@\B@
  557.  \edef\next@{\nextii@ \expandafter\removePT@\the\dimen@ @}%
  558.  \fi
  559.  \expandafter\interpolatepoint@\next@
  560.  \edef\next@{\expandafter\nextiii@\next@}%
  561.  \fi 
  562.  \expandafter\vfromcartesian@@\next@
  563.  \leave@}
  564. \xydef@\chooseangleinterval@#1#2#3#4{%
  565.  \B@=#2\p@ \def\next{#3}%
  566.  \ifdim\R@<\B@ \dimen@ii=\B@ \let\nextii@=\next #1%
  567.  \else \dimen@=\B@ \let\next@=\next \ifdim\B@<\R@ #4\fi\fi}
  568. \xydef@\interpolateinterval@#1,#2@#3,#4@{%
  569.  \A@=#1\p@ \dimen@=#3\p@ \advance\dimen@-\A@ \advance\A@\next\dimen@
  570.  \B@=#2\p@ \dimen@=#4\p@ \advance\dimen@-\B@ \advance\B@\next\dimen@
  571.  \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
  572. \xydef@\toradians@{0.01745329}
  573. \xydef@\interpolatepoint@#1,#2@#3@{%
  574.  \A@=#1\p@ \dimen@ii=#3\A@ \dimen@ii=-.5\dimen@ii \advance\A@#3\dimen@ii
  575.  \dimen@=-#2\p@ \advance\A@#3\dimen@
  576.  \B@=#2\p@ \dimen@ii=#3\B@ \dimen@ii=-.5\dimen@ii \advance\B@#3\dimen@ii
  577.  \dimen@=#1\p@ \advance\B@#3\dimen@
  578.  \edef\next@{\expandafter\removePT@\the\A@,\expandafter\removePT@\the\B@ @}}
  579. \xydef@\drop@#1#2{%
  580.  \global\setbox\lastobjectbox@=\object#1{#2}%
  581.  \ifHidden@ \dimen@=\Xc \advance\dimen@-\Lc \else
  582.  \dimen@=\Yc \advance\dimen@ \Uc \ifdim\Ymax<\dimen@ \Ymax=\dimen@ \fi
  583.  \dimen@=\Yc \advance\dimen@-\Dc \ifdim\dimen@<\Ymin \Ymin=\dimen@ \fi
  584.  \dimen@=\Xc \advance\dimen@ \Rc \ifdim\Xmax<\dimen@ \Xmax=\dimen@ \fi
  585.  \dimen@=\Xc \advance\dimen@-\Lc \ifdim\dimen@<\Xmin \Xmin=\dimen@ \fi \fi
  586.  \ifInvisible@\else
  587.  \setboxz@h{\kern\dimen@ \raise\Yc\box\lastobjectbox@}%
  588.  \ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi}
  589. \xydef@\connect@#1#2{\setupDirection@ \enter@{\cfromthec@}%
  590.  \global\setbox\lastobjectbox@=\object#1{#2}\leave@
  591.  \Connect@@}
  592. \xydef@\afterPLACE#1{%
  593.  \DN@##1{\def\afterPLACE@{\xy@@\leave@ \def\afterPLACE@{##1}#1}}%
  594.  \expandafter\next@\expandafter{\afterPLACE@}%
  595.  \xy@@{\enter@{\pfromthep@}%
  596.  \Creset@@
  597.  \def\PLACEf@{{.5}}%
  598.  \let\PLACEedgep@@=\PLACEedgep@ \let\PLACEedgec@@=\PLACEedgec@}%
  599.  \xyFN@\PLACE@}
  600. \xydef@\PLACEf@{}
  601. \xydef@\PLACEedgep@@{}
  602. \xydef@\PLACEedgec@@{}
  603. \xydef@\PLACEedgep@{\Cshavep@@ \def\PLACEedgep@@{\Cslidep@@\jot}}
  604. \xydef@\PLACEedgec@{\Cshavec@@ \def\PLACEedgec@@{\Cslidec@@{-\jot}}}
  605. \xylet@\afterPLACE@=\empty
  606. \xydef@\PLACE@{%
  607.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@}%
  608.  \else\addLT@\ifx \next
  609.  \addLT@\DN@{\addLT@\xy@{\def\PLACEf@{{0}}\PLACEedgep@@}\xyFN@\PLACE@}%
  610.  \else\addGT@\ifx \next
  611.  \addGT@\DN@{\addGT@\xy@{\def\PLACEf@{{1}}\PLACEedgec@@}\xyFN@\PLACE@}%
  612.  \else\ifx (\next
  613.  \DN@(##1){\def\PLACEf@{{##1}}\xy@{(##1)}{\def\PLACEf@{{##1}}}\xyFN@\PLACE@}%
  614.  \else
  615.  \DN@{\xy@@{\expandafter\Calong@@\PLACEf@ \czeroEdge@}\PLACE@@}%
  616.  \fi\fi\fi\fi \next@}
  617. \xydef@\PLACE@@{%
  618.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\PLACE@@}%
  619.  \else\ifx /\next \DN@/##1/{\xy@{/##1/}{\Cslidec@@{##1}}\afterPLACE@}%
  620.  \else \let\next@=\afterPLACE@
  621.  \fi\fi \next@}
  622. \xydef@\intersect@{%
  623.  \dX=\Xc \advance\dX-\Xp \dY=\Yc \advance\dY-\Yp
  624.  \A@=\Xc \advance\A@-\Xorigin \B@=\Yc \advance\B@-\Yorigin
  625.  \edef\next@{\expandafter\removePT@\the\Rc}%
  626.  \edef\nextii@{\expandafter\removePT@\the\Uc}%
  627.  \Dc=\next@\dY \advance\Dc-\nextii@\dX \divide\Dc\KK@
  628.  \Lc=\next@\B@ \advance\Lc-\nextii@\A@ \divide\Lc\KK@
  629.  \ifdim\Dc=\z@\DN@{0}\else \quotient@\next@\Lc\Dc \fi
  630.  \advance\Xc-\next@\dX \advance\Yc-\next@\dY
  631.  \czeroEdge@}
  632. \xydef@\vfromslide@#1{\enter@\DirectionfromtheDirection@ \begingroup
  633.  \plainxy@\afterDIRECTIONorEMPTY\vfromslide@i\vfromslide@i#1@}
  634. \xydef@\vfromslide@i#1@{%
  635.  \edef\next{\endgroup 
  636.  \dimen@=#1\relax \Xc=\cosDirection\dimen@ \Yc=\sinDirection\dimen@}\next
  637.  \leave@}
  638. \xydef@\sbot@{-1}
  639. \xydef@\stop@{-1}
  640. \xydef@\cfroms@#1{%
  641.  \count@=\stop@ \advance\count@-#1\relax
  642.  \DN@{\count@=\stop@ \advance\count@-\sbot@
  643.  \xyerror@{stack index out of range (should be 0..\the\count@)}{}}%
  644.  \ifnum\count@>\sbot@ \ifnum\count@>\stop@\else \let\next@=\relax \fi\fi
  645.  \csname S@\the\count@\endcsname}
  646. \xydef@\STACK@{%
  647.  \addPLUS@\ifx\next
  648.  \addPLUS@\DN@{\xy@{@+}{}\afterCOORD{\xy@@\spushc@ \xyFN@\POS@}}%
  649.  \else\addDASH@\ifx\next
  650.  \addDASH@\DN@{\xy@{@-}{}\afterCOORD{\xy@@\spop@ \xyFN@\POS@}}%
  651.  \else \ifx i\next \DN@ i{\xy@{@i}\sinit@ \xyFN@\POS@}%
  652.  \else \ifx (\next \DN@ ({\xy@{@(}\senter@ \xyFN@\POS@}%
  653.  \else \ifx )\next \DN@ ){\xy@{@)}\sleave@ \xyFN@\POS@}%
  654.  \else\addAT@\ifx\next \addAT@\DN@{\xy@{@@}{}\smap@}%
  655.  \else \DN@##1{\xyerror@{illegal stack command ##1}{}\afterCOORD{\xyFN@\POS@}}%
  656.  \fi\fi\fi\fi\fi\fi \next@}
  657. \xydef@\spushc@{%
  658.  \count@=\stop@ \advance\count@\@ne \edef\stop@{\the\count@}%
  659.  \expandafter\edef\csname S@\stop@\endcsname{\cfromthec@}}
  660. \xydef@\spop@{\count@=\stop@
  661.  \ifnum\count@>\sbot@ \advance\count@\m@ne \edef\stop@{\the\count@}%
  662.  \else \xyerror@{nothing to pop from stack}{}\fi}
  663. \xydef@\sinit@{\edef\stop@{\sbot@}}
  664. \xydef@\senter@{%
  665.  \count@=\stop@ \advance\count@\@ne
  666.  \expandafter\edef\csname S@\the\count@\endcsname{\sbot@}%
  667.  \edef\sbot@{\the\count@}\edef\stop@{\the\count@}}
  668. \xydef@\sleave@{%
  669.  \ifnum\sbot@=\stop@\else
  670.  \xywarning@{leaving non-empty stack}\edef\stop@{\sbot@}\fi
  671.  \ifnum\sbot@>\m@ne \edef\sbot@{\csname S@\stop@\endcsname}%
  672.  \count@=\stop@ \advance\count@\m@ne \edef\stop@{\the\count@}%
  673.  \edef\sbot{\the\count@}\fi}
  674. \xydef@\sempty@{\ifnum\stop@=\sbot@ TT\else TF\fi}
  675. \xydef@\xytotoks@#1#2{\addtotoks@{#2}}
  676. \xydef@\xytotoks@@toksix@#1{\addtotoks@{\toks9={#1}}}
  677. \xydef@\smap@{%
  678.  \begingroup \toks@={}\let\xy@=\xytotoks@ \let\oxy@=\xy@
  679.  \let\xy@@ix@=\xytotoks@@toksix@
  680.  \afterCOORD{\expandafter\endgroup
  681.  \expandafter\smapxy@@\expandafter{\the\toks@}\xyFN@\POS@}}
  682. \xydef@\smapxy@@#1{\xy@@{\edef\smapp@@{\sbot@}\smapxy@i{#1}}}
  683. \xylet@\smapp@@=\empty
  684. \xydef@\smapxy@i#1{%
  685.  \ifnum\smapp@@<\stop@
  686.  \count@=\smapp@@ \advance\count@\@ne \edef\smapp@@{\the\count@}%
  687.  \DN@{\csname S@\smapp@@\endcsname #1\relax \smapxy@i{#1}}%
  688.  \else \let\next@=\relax
  689.  \fi \next@}
  690. \xydef@\saveid@{%
  691.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\saveid@}%
  692.  \else \ifx "\next\DN@"##1"{\xy@{="##1"}{\idfromc@{##1}}\xyFN@\POS@}%
  693.  \else \ifx :\next\DN@:##1"##2"{\xy@{=:"##2"}{\idfrombase@{##2}}\xyFN@\POS@}%
  694.  \else \let\next@=\saveid@COORD
  695.  \fi\fi\fi \next@}
  696. \xydef@\xyscope@{}
  697. \xydef@\xyprefix@@{}
  698. \xydef@\idfromc@#1{\DN@{#1}%
  699.  \expandafter\edef\csname Q@\codeof\next@\endcsname{\cfromthec@}}
  700. \xydef@\idfrombase@#1{\DN@{#1}%
  701.  \expandafter\edef\csname Q@\codeof\next@\endcsname{\basefromthebase@}}
  702. \xydef@\saveid@COORD{%
  703.  \begingroup \toks@={}\let\xy@=\xytotoks@ \let\oxy@=\xy@
  704.  \let\xy@@ix@=\xytotoks@@toksix@
  705.  \afterCOORD{\expandafter\saveid@COORDi\expandafter{\the\toks@}}}
  706. \xydef@\saveid@COORDi#1#2"#3"{\endgroup \xy@@{\idfromxy@{#3}{#1}}\xyFN@\POS@}
  707. \xydef@\idfromxy@#1#2{\DN@{#1}%
  708.  \expandafter\def\csname Q@\codeof\next@\endcsname{#2}}
  709. \xydef@\cfromid@#1{\DNii@{#1}\edef\nextii@{\codeof\nextii@}%
  710.  \expandafter\let\expandafter\next@\csname Q@\nextii@\endcsname
  711.  \ifx\next@\relax
  712.  \xyerror@{<pos> \string"\nextii@\string" not defined}{}%
  713.  \else \expandafter\next@\fi}
  714. \message{objects,}
  715. \xydef@\OBJECT@{%
  716.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\OBJECT@}%
  717.  \else\ifcat A\noexpand\next \let\next@=\OBJECT@letter
  718.  \else \let\next@=\OBJECT@other \fi\fi \next@}
  719. \xydef@\OBJECT@letter{%
  720.  \ifx i\next
  721.  \DN@ i{\addtotoks@\Invisible@true \xyFN@\OBJECT@}%
  722.  \else\ifx h\next
  723.  \DN@ h{\addtotoks@\Hidden@true \xyFN@\OBJECT@}%
  724.  \else\ifx o\next \DN@ o{\xywarning@{o modifier used}\OBJECT@shape{o}}%
  725.  \else\ifx x\next \DN@ x{\xywarning@{x modifier used}\OBJECT@shape{}}%
  726.  \else \let\next@=\OBJECT@direction
  727.  \fi\fi\fi\fi \next@}
  728. \xydef@\OBJECT@other{%
  729.  \ifx !\next \DN@!{\OBJECT@shift}%
  730.  \else\addPLUS@\ifx \next \DN@{\OBJECT@change+>}%
  731.  \else\addDASH@\ifx \next \DN@{\OBJECT@change-<}%
  732.  \else\addEQ@\ifx \next \DN@{\OBJECT@set}%
  733.  \else\ifx [\next
  734.  \DN@[##1]{\xy@{[##1]}{\OBJECT@shape{##1}}}%
  735.  \else\ifx ^\next \let\next@=\OBJECT@direction
  736.  \else\ifx _\next \let\next@=\OBJECT@direction
  737.  \else\ifx :\next \let\next@=\OBJECT@direction
  738.  \else\ifx ?\next
  739.  \DN@ ?{\xywarning@{\string? modifier used}\xyFN@\OBJECT@direction}%
  740.  \else \DN@##1##{\OBJECT@@{##1}}%
  741.  \fi\fi\fi\fi\fi\fi\fi\fi\fi \next@}
  742. \xydef@\addDirectiontotoks@{\edef\nextiii@{{\DirectionfromtheDirection@}}%
  743.  \expandafter\addtotoks@\nextiii@}
  744. \xydef@\OBJECT@@#1#2{\Edgec={\objectEdge}%
  745.  \Invisible@false\Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
  746.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@\relax}%
  747.  \DN@{#1}\ifx\next@\empty \DNii@{#2}%
  748.  \ifx\nextii@\empty \DN@{\hbox\bgroup\no@}\else \let\next@=\objectbox \fi\fi
  749.  \setbox\z@=\next@{#2}\Lc=\Leftness@\wdz@ \Rc=\wdz@ \advance\Rc-\Lc
  750.  \Dc=\dp\z@ \advance\Dc\ht\z@ \Uc=\Upness@\Dc \advance\Dc-\Uc
  751.  \Rp=\z@ \Lp=\Lc \Up=\Uc \advance\Up-\ht\z@ \Dp=-\Up
  752.  \the\toks@\toks@={}\setboxz@h{\kern\Rp \raise\Up\boxz@}%
  753.  \ifdim\Rc=\z@ \ifdim\Uc=\z@ \ifdim\Lc=\z@ \ifdim\Dc=\z@
  754.  \Edgec={\zeroEdge}\fi\fi\fi\fi
  755.  \dimen@=\Lc \advance\dimen@\Rc \wdz@=\dimen@ \ht\z@=\Uc \dp\z@=\Dc \boxz@
  756.  \OBJECT@x}
  757. \xydef@\adjustLR@{%
  758.  \ifdim\wdz@=\z@ \Lc=\z@ \Rc=\z@ \dimen@=\Leftness@\p@
  759.  \ifdim\dimen@<\z@ \Lc=\dimen@ \Rc=-\Lc
  760.  \else\ifdim\dimen@>\p@ \Lc=\dimen@ \advance\Lc-\p@ \Rc=-\Lc \fi\fi
  761.  \else \Lc=\Leftness@\wdz@ \Rc=\wdz@ \advance\Rc-\Lc \fi }
  762. \xydef@\adjustUD@{\dimen@=\ht\z@ \advance\dimen@\dp\z@
  763.  \ifdim\dimen@=\z@ \Uc=\z@ \Dc=\z@ \dimen@=\Upness@\p@
  764.  \ifdim\dimen@<\z@ \Uc=\dimen@ \Dc=-\Lc
  765.  \else\ifdim\dimen@>\p@ \Uc=\dimen@ \advance\Uc-\p@ \Dc=-\Lc \fi\fi
  766.  \else \Dc=\dimen@ \Uc=\Upness@\dimen@ \advance\Dc-\Uc \fi }
  767. \xydef@\OBJECT@x{\toks@={\egroup\def\Drop@@}%
  768.  \expandafter\addtotoks@\expandafter{\expandafter{\Drop@@}\def\Connect@@}%
  769.  \expandafter\addtotoks@\expandafter{\expandafter{\Connect@@}}%
  770.  \edef\tmp@{\Dc=\the\Dc \Uc=\the\Uc \Lc=\the\Lc \Rc=\the\Rc
  771.  \Edgec={\expandafter\noexpand\the\Edgec}%
  772.  \ifInvisible@\noexpand\Invisible@true\else\noexpand\Invisible@false\fi
  773.  \ifHidden@\noexpand\Hidden@true\else\noexpand\Hidden@false\fi
  774.  \def\noexpand\Leftness@{\Leftness@}\def\noexpand\Upness@{\Upness@}}%
  775.  \expandafter\addtotoks@\expandafter{\tmp@}\the\toks@}
  776. \xynew@{if}\ifInvisible@
  777. \xynew@{if}\ifHidden@
  778. \xydef@\Leftness@{}
  779. \xydef@\Upness@{}
  780. \xydef@\Drop@@{\boxz@}
  781. \xydef@\Connect@@{}
  782. \xydef@\objectbox#1{\hbox{$\m@th\objectstyle{#1}$}}
  783. \xylet@\objectstyle=\textstyle
  784. \xydef@\object{\hbox\bgroup\object@}
  785. \xydef@\object@{%
  786.  \edef\next@{={\DirectionfromtheDirection@}}\expandafter\toks@\next@
  787.  \plainxy@ \xyFN@\OBJECT@}
  788. \xydef@\composite#1#{\hbox\bgroup\composite@{#1}}
  789. \xydef@\composite@#1#2{%
  790.  \DN@{#1}\ifx\next@\empty\else\xywarning@{no variants of
  791.  \string\composite\space allowed}\fi
  792.  \global\setbox9=\hbox\bgroup
  793.  \Dp=-\maxdimen \Up=-\maxdimen \Lp=-\maxdimen \Rp=-\maxdimen
  794.  \xyFN@\composite@i#2@}
  795. \xydef@\composite@i{%
  796.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@i}%
  797.  \else\ifx *\next \DN@ *{\xyFN@\composite@i}%
  798.  \else\ifx @\next \DN@ @{\composite@x}%
  799.  \xyerror@{<composite> object expected}{}\czeroEdge@
  800.  \else \DN@{\composite@ii}\fi\fi\fi \next@}
  801. \xydef@\composite@ii#1#{\composite@iii{#1}}
  802. \xydef@\composite@iii#1#2{%
  803.  \setbox\z@=\object#1{#2}%
  804.  \ifInvisible@ \setboxz@h{}%
  805.  \else \setboxz@h{\kern-\Lc \boxz@}\ht\z@=\z@ \dp\z@=\z@ \wd\z@=\z@ {\Drop@@}\fi
  806.  \ifHidden@\else
  807.  \ifdim\Up<\Uc \Up=\Uc \fi \ifdim\Dp<\Dc \Dp=\Dc \fi
  808.  \ifdim\Rp<\Rc \Rp=\Rc \fi \ifdim\Lp<\Lc \Lp=\Lc \fi
  809.  \fi
  810.  \xyFN@\composite@iv}
  811. \xydef@\composite@iv{%
  812.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\composite@iv}%
  813.  \else \ifx @\next \DN@ @{\composite@x}%
  814.  \else \let\next@=\composite@i \fi\fi \next@}
  815. \xydef@\composite@x{%
  816.  \edef\tmp@{\egroup \Dc=\the\Dp \Uc=\the\Up \Lc=\the\Lp \Rc=\the\Rp}\tmp@
  817.  \setboxz@h{\kern\Lc\box9}\ht\z@=\Uc \dp\z@=\Dc
  818.  \dimen@=\Lc \advance\dimen@\Rc \wdz@=\dimen@
  819.  \Edgec={\rectangleEdge}\computeLeftUpness@ \boxz@
  820.  \OBJECT@x}
  821. \xydef@\computeLeftUpness@{%
  822.  \dimen@=\Lc \advance\dimen@\Rc
  823.  \ifdim\dimen@=\z@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
  824.  \ifdim\Lc=\z@\else
  825.  \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edgec}%
  826.  \ifx\next@\nextii@\Edgec={\rectangleEdge}\fi\fi
  827.  \else \quotient@\Leftness@\Lc\dimen@ \fi
  828.  \dimen@=\Uc \advance\dimen@\Dc 
  829.  \ifdim\dimen@=\z@ \def\Connect@@{\straight@{\dottedSpread@\jot}}%
  830.  \ifdim\Uc=\z@\else
  831.  \DN@{\zeroEdge}\expandafter\DNii@\expandafter{\the\Edgec}%
  832.  \ifx\next@\nextii@\Edgec={\rectangleEdge}\fi\fi
  833.  \else \quotient@\Upness@\Uc\dimen@ \fi}
  834. \xydef@\xybox#1{\xy#1\endxy \Edgec={\rectangleEdge}\computeLeftUpness@}
  835. \xydef@\OBJECT@shift{%
  836.  \let\xy@=\xytotoks@ \afterVECTORorEMPTY
  837.  {\OBJECT@shift@}%
  838.  {\addtotoks@{\Xc=-\Lc \advance\Xc\Rp \advance\Xc\Lp \Yc=\Up}\OBJECT@shift@}}
  839. \xydef@\OBJECT@shift@{%
  840.  \addtotoks@{\advance\Up-\Yc
  841.  \advance\Lc\Xc \advance\Rc-\Xc \advance\Dc\Yc \advance\Uc-\Yc
  842.  \computeLeftUpness@}%
  843.  \let\xy@=\oxy@
  844.  \xyFN@\OBJECT@}
  845. \xylet@\objectmargin@=\jot
  846. \xylet@\objectwidth@=\z@
  847. \xylet@\objectheight@=\z@
  848. \xydef@\objectmargin{\afterADDOP{\Addop@@\objectmargin@}}
  849. \xydef@\objectwidth{\afterADDOP{\Addop@@\objectwidth@}}
  850. \xydef@\objectheight{\afterADDOP{\Addop@@\objectheight@}}
  851. \xydef@\OBJECT@change#1#2{%
  852.  \afterADDOP{%
  853.  \addEQ@\ifx \next
  854.  \addtotoks@{\Xc=\Dc \advance\Xc\Uc \Yc=\Lc \advance\Yc\Rc}%
  855.  \else
  856.  \addtotoks@{\Xc=\objectmargin@ \advance\Xc\Xc \Yc=\Xc}%
  857.  \fi
  858.  \let\xy@=\xytotoks@ 
  859.  \afterVECTORorEMPTY{\OBJECT@change@#1#2}{\OBJECT@change@#1#2}}}
  860. \xydef@\OBJECT@set{%
  861.  \afterADDOP{%
  862.  \let\xy@=\xytotoks@ \afterVECTORorEMPTY
  863.  {\OBJECT@change@+=}%
  864.  {\addtotoks@{\Xc=\objectwidth@ \Yc=\objectheight@}\OBJECT@change@+=}}}
  865. \xydef@\OBJECT@change@#1#2{%
  866.  \addtotoks@{\advance\Rc\Lc \advance\Rp-\Lc \let\tmp@=\Rc}%
  867.  \expandafter\addtotoks@\expandafter{\Addop@@\tmp@{#1\Xc}\Rc=\tmp@
  868.  \Lc=\Leftness@\Rc \advance\Rp\Lc \advance\Rc-\Lc}%
  869.  \addtotoks@{\advance\Dc\Uc \let\tmp@=\Dc}%
  870.  \expandafter\addtotoks@\expandafter{\Addop@@\tmp@{#1\Yc}\Dc=\tmp@
  871.  \Uc=\Upness@\Dc \advance\Dc-\Uc}%
  872.  \let\xy@=\oxy@ \xyFN@\OBJECT@}
  873. \xydef@\afterADDOP#1{\def\afterADDOP@{#1}\xyFN@\ADDOP@}
  874. \xylet@\afterADDOP@=\empty
  875. \xydef@\ADDOP@{%
  876.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\ADDOP@}%
  877.  \else\addPLUS@\ifx \next \addPLUS@\DN@{\xyFN@\ADDOP@plus}%
  878.  \else\addDASH@\ifx \next \addDASH@\DN@{\xyFN@\ADDOP@minus}%
  879.  \else\addEQ@\ifx \next
  880.  \addEQ@\DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
  881.  \else
  882.  \DN@{\def\Addop@@{\Addop@0+=}\afterADDOP@}%
  883.  \fi\fi\fi\fi \next@}
  884. \xydef@\ADDOP@plus{%
  885.  \addEQ@\ifx \next
  886.  \addEQ@\DN@{\def\Addop@@{\Addop@0+<}\afterADDOP@}%
  887.  \else
  888.  \DN@{\def\Addop@@{\Addop@1+=}\afterADDOP@}%
  889.  \fi \next@}
  890. \xydef@\ADDOP@minus{%
  891.  \addEQ@\ifx \next
  892.  \addEQ@\DN@{\def\Addop@@{\Addop@0->}\afterADDOP@}%
  893.  \else
  894.  \DN@{\def\Addop@@{\Addop@1-=}\afterADDOP@}%
  895.  \fi \next@}
  896. \xydef@\Addop@#1#2#3#4#5{%
  897.  \dimen@=#4\relax \edef#4{\the\dimen@}%
  898.  \dimen@=#1\dimen@ \advance\dimen@#2#5\relax
  899.  \ifdim\dimen@#3#4\else \edef#4{\the\dimen@}\fi
  900.  \ifx\xy@\xyinitial@\else \DN@##1{\xy@@{\edef#4{##1}}}%
  901.  \expandafter\next@\expandafter{#4}\fi}
  902. \xydef@\objectEdge{\rectangleEdge}
  903. \xydef@\OBJECT@shape#1{\DN@{*shape@#1@}%
  904.  \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
  905.  \ifx\next\relax \DN@{\OBJECT@shapei[#1]}%
  906.  \else \DN@{\expandafter\addtotoks@\expandafter{\next}\xyFN@\OBJECT@}\fi
  907.  \next@}
  908. \xydefcsname@{*shape@@}{\the\Edgec4}
  909. \xydefcsname@{*shape@o@}{\Edgec={\circleEdge}\Lc=\Rc \Uc=\Rc \Dc=\Rc}
  910. \xydefcsname@{*shape@.@}{\czeroEdge@}
  911. \xydef@\OBJECT@shapei[#1#2]{\DN@{*shapechar@#1@}%
  912.  \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
  913.  \ifx\next\relax \DN@{[#1#2]}%
  914.  \xywarning@{illegal [<shape>] ignored: \codeof\next@\space not defined}%
  915.  \else \expandafter\addtotoks@\expandafter{\next{#2}}\fi
  916.  \xyFN@\OBJECT@}
  917. \xydef@\OBJECT@direction{\afterDIRECTIONorEMPTY{%
  918.  \edef\next@{{\DirectionfromtheDirection@}}\expandafter\addtotoks@\next@
  919.  \xyFN@\OBJECT@}%
  920.  {\xyFN@\OBJECT@}}
  921. \xydef@\afterDIRECTIONorEMPTY#1#2{%
  922.  \DN@##1{\def\afterDIRECTION@{\def\afterDIRECTION@{##1}%
  923.  \ifDIRECTIONempty@\DN@{#2}\else\DN@{#1}\fi \next@}}%
  924.  \expandafter\next@\expandafter{\afterDIRECTION@}%
  925.  \xyFN@\DIRECTION@}
  926. \xylet@\afterDIRECTION@=\empty
  927. \xynew@{if}\ifDIRECTIONempty@
  928. \xydef@\DIRECTION@{%
  929.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\DIRECTION@}%
  930.  \else\ifx v\next \DN@ v{\DIRECTION@v}%
  931.  \else
  932.  \DN@{\count@=8
  933.  \afterDIAG{\ifnum\count@=8 \DN@{\DIRECTIONempty@true \xyFN@\DIRECTION@i}%
  934.  \else \DN@{\xy@@{\dimen@=\xydashl@}\Directionfromdiag@}\fi \next@}}%
  935.  \fi\fi \next@}
  936. \def\afterDIAG#1{\def\afterDIAG@{#1}\xyFN@\DIAG@}
  937. \xydef@\DIAG@{%
  938.  \ifx d\next \DN@ d{\count@=1 \xyFN@\DIAG@@}%
  939.  \else\ifx r\next \DN@ r{\count@=3 \xyFN@\DIAG@@}%
  940.  \else\ifx u\next \DN@ u{\count@=5 \xyFN@\DIAG@@}%
  941.  \else\ifx l\next \DN@ l{\count@=7 \xyFN@\DIAG@@}%
  942.  \else \let\next@=\afterDIAG@
  943.  \fi\fi\fi\fi \next@}
  944. \xydef@\DIAG@@{\ifcase\count@ \or
  945.  \DIAG@@@ l0r2\or\or \DIAG@@@ d2u4\or\or \DIAG@@@ r4l6\or\or \DIAG@@@ u6d0%
  946.  \else\xybug@{impossible <diag> number}\fi
  947.  \next@}
  948. \xydef@\DIAG@@@#1#2#3#4{%
  949.  \ifx #1\next \count@=#2\DN@#1{\afterDIAG@}%
  950.  \else \ifx #3\next \count@=#4\DN@#3{\afterDIAG@}%
  951.  \else \let\next@=\afterDIAG@ \fi\fi}
  952. \xydef@\Directionfromdiag@{\ifcase\count@
  953.  \xy@@{\dlDirection@\dimen@}%
  954.  \or \xy@@{\dDirection@\dimen@}%
  955.  \or \xy@@{\drDirection@\dimen@}%
  956.  \or \xy@@{\rDirection@\dimen@}%
  957.  \or \xy@@{\urDirection@\dimen@}%
  958.  \or \xy@@{\uDirection@\dimen@}%
  959.  \or \xy@@{\ulDirection@\dimen@}%
  960.  \or \xy@@{\lDirection@\dimen@}%
  961.  \or
  962.  \else\xybug@{impossible <diag>}\fi
  963.  \DIRECTIONempty@false\xyFN@\DIRECTION@i}
  964. \xydef@\DIRECTION@v{\begingroup \xy@{v}{\Xorigin=\z@ \Yorigin=\z@}%
  965.  \afterVECTORorEMPTY
  966.  {\xy@@{\Xp=\z@ \Yp=\z@ \setupDirection@}%
  967.  \edef\next@{\noexpand\xy@@\DirectionfromtheDirection@}%
  968.  \expandafter\endgroup\next@ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
  969.  {\xyerror@{<vector> expected after v}{}\endgroup
  970.  \DIRECTIONempty@false \xyFN@\DIRECTION@i}}
  971. \xydef@\DIRECTION@i{%
  972.  \ifx ^\next \DN@ ^{\xy@^{\aboveDirection@\xydashl@}%
  973.  \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
  974.  \else\ifx _\next \DN@ _{\xy@_{\belowDirection@\xydashl@}%
  975.  \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
  976.  \else\ifx :\next \DN@ :{\begingroup
  977.  \xy@:{\Xorigin=\z@ \Yorigin=\z@
  978.  \Xxbase=\dX \Yxbase=\dY \Xybase=-\dY \Yybase=\dX}%
  979.  \afterVECTORorEMPTY
  980.  {\xy@@{\Xp=\z@ \Yp=\z@ \setupDirection@}%
  981.  \edef\next@{\noexpand\xy@@\DirectionfromtheDirection@}%
  982.  \expandafter\endgroup\next@ \DIRECTIONempty@false \xyFN@\DIRECTION@i}%
  983.  {\xyerror@{<vector> expected after \string:}{}\endgroup
  984.  \DIRECTIONempty@false \xyFN@\DIRECTION@i}}%
  985.  \else
  986.  \let\next@=\afterDIRECTION@
  987.  \fi\fi\fi \next@}
  988. \message{decorations;}
  989. \xydef@\drop#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
  990.  \xy@{\drop#1{##1}}{\expandafter\drop@\the\toks9}\ignorespaces}\next@}
  991. \xydef@\connect#1#{\DN@##1{\xy@@ix@{{#1}{##1}}%
  992.  \xy@{\connect#1{##1}}{\expandafter\connect@\the\toks9}\ignorespaces}\next@}
  993. \xydef@\save{\xy@\save\save@ \POS}
  994. \xydef@\save@{\enter@{\cfromthec@ \pfromthep@ \basefromthebase@}}
  995. \xydef@\restore{\xy@\restore\leave@ \ignorespaces}
  996. \xydef@\xyverbose{\xy@\xyverbose{\let\xy@=\xyverbose@
  997.  \W@{XY: \string\xyverbose\xytracelineno@}}}
  998. \xydef@\xyverbose@#1#2{%
  999.  {\def\1{#1}\ifx\1\empty\else\W@{XY: \codeof\1\xytracelineno@}\fi}%
  1000.  \oxy@{#1}{#2}}
  1001. \xydef@\xytracing{\xy@\xytracing{\let\xy@=\xytracing@
  1002.  \W@{XY TRACE: \string\xytracing\xytracelineno@}\xystatus@:}}
  1003. \xydef@\xytracing@#1#2{{\def\1{#1}\def\2{#2}%
  1004.  \W@{XY TRACE: \codeof\1 {\codeof\2}\xytracelineno@}}\oxy@{#1}{#2}\xystatus@:}
  1005. \xydef@\xystatus@#1{%
  1006.  \W@{#1 c=<\the\Xc,\the\Yc> \expandafter\string\the\Edgec
  1007.  \string[\the\Lc+\the\Rc,\the\Dc+\the\Uc\string]}%
  1008.  \W@{#1 p=<\the\Xp,\the\Yp> \expandafter\string\the\Edgep
  1009.  \string[\the\Lp+\the\Rp,\the\Dp+\the\Up\string]}%
  1010.  \W@{#1 [d=<\the\dX,\the\dY>
  1011.  Direction=\the\Direction=\string(\cosDirection,\sinDirection\string)]
  1012.  S=\the\csp@}%
  1013.  \W@{#1 base = <\the\Xorigin,\the\Yorigin> +
  1014.  x\string*<\the\Xxbase,\the\Yxbase> +
  1015.  y\string*<\the\Xybase,\the\Yybase>}%
  1016.  \W@{#1 min/max = <\the\Xmin,\the\Ymin> / <\the\Xmax,\the\Ymax>}}
  1017. \xydef@\xyquiet{\xy@\xyverbose{\let\xy@=\oxy@
  1018.  \W@{XY: \string\xyverbose\xytracelineno@}}}
  1019. \xydef@\xyignore#1{\xy@\xyignore{\xyignore@{#1}}\ignorespaces}
  1020. \xydef@\xyignore@#1{{\let\xy@=\xyeat@ \let\oxy@=\xy@ \POS#1\relax}}
  1021. \xydef@\xyeat@#1#2{}
  1022. \xylet@\compilename@@=\empty
  1023. \xylet@\xyrecompile@@=\relax
  1024. \xydef@\xycompileto#1#2{\if\inxy@ \DN@{\xy@@{\nter@{}}}%
  1025.  \else \DN@{\xy \xy@@{\nter@\endxy}}\fi \next@
  1026.  \ifxysaving@ \xyerror@{Compilations can not be nested}{}\fi
  1027.  \DN@{#1}\edef\compilename@@{\codeof\next@}\DNii@{#2}%
  1028.  \expandafter\xyinputorelse@\expandafter{\compilename@@.xyc}%
  1029.  {\def\xyrecompile@@{compiling new}}%
  1030.  \ifx\xyrecompile@@\relax\else \expandafter\xyrecompile@ \fi \xy@@\leave@}
  1031. \xydef@\xyrecompile@{%
  1032.  \message{(\xyrecompile@@\space\string`\compilename@@.xyc\string'}%
  1033.  \DN@{\immediate\openout\xywrite@=}\expandafter\next@\compilename@@.xyc
  1034.  \immediate\write\xywrite@{%
  1035.  \string\xycompiled{\compilename@@}%
  1036.  {\the\year/\the\month/\the\day\string:\the\time\xytracelineno@}%
  1037.  {Xy-pic \xyversion}\xycomment@}%
  1038.  \immediate\write\xywrite@{{\codeof\nextii@}\relax}%
  1039.  {\xysaving@ \expandafter\POS\nextii@ \relax}%
  1040.  \immediate\write\xywrite@{\string\xyendcompiled}%
  1041.  \immediate\closeout\xywrite@ \message{done)}%
  1042.  \expandafter\input\compilename@@.xyc }
  1043. \xydef@\xysaving@{\let\xy@=\xysave@ \let\oxy@=\xy@
  1044.  \let\xy@@ix@=\xysave@@toksix@ \xysaving@true}
  1045. \xynew@{if}\ifxysaving@ \xysaving@false
  1046. \xydef@\xysave@#1#2{{\DN@{\xy@{#1}{#2}}%
  1047.  \immediate\write\xywrite@{\codeof\next@\xycomment@}}}
  1048. \xydef@\xysave@@toksix@#1{{\DN@{\xy@@ix@{#1}}%
  1049.  \immediate\write\xywrite@{\codeof\next@\relax}}}
  1050. \xywarnifdefined\xycomment@
  1051. {\catcode`\%=12 \catcode`\(=1 \catcode`\)=2 \gdef\xycomment@(%)}
  1052. \xydef@\xycompiled#1#2#3#4{\DN@{#1}\edef\next@{\codeof\next@}%
  1053.  \ifx\next@\compilename@@\else
  1054.  \xywarning@{This file does not contain the result of
  1055.  \string\xycompileto{\compilename@@}{...}^^J%
  1056.  but of \string\xycompileto{\next@}}\fi
  1057.  \edef\next{Xy-pic \xyversion}\DN@{#3}\ifx\next\next@
  1058.  \DN@{#4}\ifx\next@\nextii@ \message{compiled #2}\xycatcodes
  1059.  \else \def\xyrecompile@@{source changed - recompiling}\xyendinput \fi
  1060.  \else \def\xyrecompile@@{XY-pic version changed - recompiling}\xyendinput \fi}
  1061. \xydef@\xyendcompiled{\let\xyrecompile@@=\relax \xyendinput}
  1062. \message{kernel objects:}
  1063. \message{directionals,}
  1064. \xydef@\dir{\hbox\bgroup\xyFN@\dir@i}
  1065. \xydef@\dir@i{\ifx *\next \DN@*{\object@}\else \let\next@=\dir@ii \fi \next@}
  1066. \xydef@\dir@ii#1#{\dir@{#1}}
  1067. \xydef@\dir@#1#2{\DN@{dir#1{#2}}%
  1068.  \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
  1069.  \ifx\next\relax \DN@{dir{#2}}%
  1070.  \expandafter\let\expandafter\next\csname\codeof\next@\endcsname
  1071.  \ifx\next\relax \DN@{\dir#1{#2}}%
  1072.  \xyerror@{illegal <dir>: \codeof\next@\space not defined}{}%
  1073.  \let\next=\no@ \fi\fi \next}
  1074. \xydefcsname@{dir{}}{\no@}
  1075. \xyletcsnamecsname@{dir0{}}{dir{}}
  1076. \xyletcsnamecsname@{dir1{}}{dir{}}
  1077. \xyletcsnamecsname@{dir^{}}{dir{}}
  1078. \xyletcsnamecsname@{dir_{}}{dir{}}
  1079. \xyletcsnamecsname@{dir2{}}{dir{}}
  1080. \xyletcsnamecsname@{dir3{}}{dir{}}
  1081. \xyletcsnamecsname@{dir{ }}{dir{}}
  1082. \xydef@\no@{\egroup \czeroEdge@ \Invisible@false \Hidden@false
  1083.  \def\Leftness@{.5}\def\Upness@{.5}%
  1084.  \def\Drop@@{\setbox\z@=\copy\voidb@x}\def\Connect@@{\no@@}}
  1085. \xydefcsname@{dir1{-}}{\line@}
  1086. \xydefcsname@{dir2{-}}{\line@ \double@\xydashh@}
  1087. \xydefcsname@{dir3{-}}{\line@ \triple@\xydashh@}
  1088. \xyletcsnamecsname@{dir0{-}}{dir{}}
  1089. \xyletcsnamecsname@{dir{-}}{dir1{-}}
  1090. \xyletcsnamecsname@{dir{=}}{dir2{-}}
  1091. \xydef@\line@{\dimen@=\sdY\sinDirection\xydashl@
  1092.  \ifnum\SemiDirectionChar<31 \Dc=\z@ \Uc=\dimen@ \DN@{\dY<\z@}%
  1093.  \else\ifnum\SemiDirectionChar<64 \Dc=\dimen@ \Uc=\z@ \DN@{\z@<\dY}%
  1094.  \else\ifnum\SemiDirectionChar<96 \Dc=\dimen@ \Uc=\z@ \DN@{\dX<\z@}%
  1095.  \else \Dc=\z@ \Uc=\dimen@ \DN@{\dX<\z@}\fi\fi\fi
  1096.  \setboxz@h{\line@@}\ht\z@=\Uc \dp\z@=\Dc
  1097.  \Lc=\z@ \Rc=\wdz@
  1098.  \ifdim\next@ \dimen@=\Rc \Rc=\Lc \Lc=\dimen@
  1099.  \dimen@=\Uc \Uc=\Dc \Dc=\dimen@ \advance\dimen@-\Uc
  1100.  \lower\dimen@\boxz@
  1101.  \else \boxz@ \fi
  1102.  \edef\tmp@{\egroup \Uc=\the\Uc \Dc=\the\Dc \Lc=\the\Lc \Rc=\the\Rc}%
  1103.  \tmp@
  1104.  \Edgec={\rectangleEdge}\Invisible@false\Hidden@false
  1105.  \ifdim\z@<\Uc \def\Upness@{1}\else \def\Upness@{0}\fi
  1106.  \ifdim\z@<\Lc \def\Leftness@{1}\else \def\Leftness@{0}\fi
  1107.  \def\Drop@@{\boxz@}\def\Connect@@{\solid@}}
  1108. \xydef@\line@@{{\xydashfont\SemiDirectionChar\/}}
  1109. \xydef@\solid@{%
  1110.  \ifInvisible@ \DN@{\no@@}%
  1111.  \else \dimen@=\Yc \advance\dimen@-\Yp
  1112.  \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{\solidhrule@}%
  1113.  \else \dimen@=\Xc \advance\dimen@-\Xp
  1114.  \ifjusthvtest@.05pt>\ifdim\dimen@<\z@-\fi\dimen@ \DN@{\solidvrule@}%
  1115.  \else \DN@{\straight@\solidSpread@}\fi\fi\fi
  1116.  \next@}
  1117. \xydef@\solidSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi}
  1118. \xylet@\ifjusthvtest@=\ifdim
  1119. \xydef@\NoRules{\let\ifjusthvtest@=\iffalse}
  1120. \xydef@\UseRules{\let\ifjusthvtest@=\ifdim}
  1121. \xydef@\solidvrule@{\no@@{%
  1122.  \ifdim\Yc<\Yp \dimen@=\Yc \Yc=\Yp \Yp=\dimen@ \advance\Yc-\Dp \advance\Yp\Uc
  1123.  \else \advance\Yc-\Dc \advance\Yp\Up \fi
  1124.  \advance\Xc-.5\xydashw@
  1125.  \setboxz@h{\kern\Xc \vrule width\xydashw@ height\Yc depth-\Yp}%
  1126.  \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}}
  1127. \xydef@\solidhrule@{\no@@{%
  1128.  \ifdim\Xc<\Xp \advance\Xc\Rc \advance\Xp-\Lp
  1129.  \else \dimen@=\Xc \Xc=\Xp \Xp=\dimen@ \advance\Xc\Rp \advance\Xp-\Lc \fi
  1130.  \advance\Xp-\Xc \advance\Yc.5\xydashw@ \advance\Yp-.5\xydashw@
  1131.  \setboxz@h{\kern\Xc \vrule width\Xp height\Yc depth-\Yp}%
  1132.  \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}}
  1133. \xydef@\zerodot{\copy\zerodotbox@}
  1134. \xydefcsname@{dir1{.}}{\point@}
  1135. \xydefcsname@{dir2{.}}{\point@ \double@\xydashh@}
  1136. \xydefcsname@{dir3{.}}{\point@ \triple@\xydashh@}
  1137. \xyletcsnamecsname@{dir0{.}}{dir{}}
  1138. \xyletcsnamecsname@{dir{.}}{dir1{.}}
  1139. \xyletcsnamecsname@{dir{:}}{dir2{.}}
  1140. \xydef@\point@{\pointlike@\zerodot\p@}
  1141. \xydef@\pointlike@#1#2{%
  1142.  \setboxz@h{#1}\wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@\egroup
  1143.  \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}\ctipEdge@
  1144.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@{\dottedSpread@{#2}}}}
  1145. \xydef@\dottedSpread@#1{\setupDirection@
  1146.  \dimen@=#1\relax \dimen@=2\dimen@
  1147.  \A@=\sdX\cosDirection\dimen@ \B@=\sdY\sinDirection\dimen@
  1148.  \global\setbox\lastobjectbox@=\hbox to\A@{\hss
  1149.  \kern.5\A@\box\lastobjectbox@\kern.5\A@\hss}%
  1150.  \dp\lastobjectbox@=.5\B@ \ht\lastobjectbox@=.5\B@
  1151.  \advance\dX\sdX\A@ \advance\dY\sdY\B@
  1152.  \advance\Xc\sdX.5\A@ \advance\Yc\sdY.5\B@
  1153.  \ifdim\sdY\dY<\sdX\dX \dimen@=\sdX\dX
  1154.  \ifdim\A@=\z@\else \divide\dimen@\A@ \fi \count@@=\dimen@
  1155.  \else\ifdim\z@=\sdY\dY\else
  1156.  \dimen@=\sdY\dY \ifdim\B@=\z@\else \divide\dimen@\B@ \fi \count@@=\dimen@
  1157.  \fi\fi \advance\count@@\@ne}
  1158. \xydefcsname@{dir1{~}}{\squiggle@}
  1159. \xydefcsname@{dir2{~}}{\squiggle@ \double@\xybsqlh@}
  1160. \xydefcsname@{dir3{~}}{\squiggle@ \triple@\xybsqlh@}
  1161. \xyletcsnamecsname@{dir0{~}}{dir{}}
  1162. \xyletcsnamecsname@{dir{~}}{dir1{~}}
  1163. \xydef@\squiggle@{\xybsqlfont
  1164.  \dimen@=\sdX\cosDirection\xybsqll@ \advance\dimen@.1\p@
  1165.  \dimen@ii=\sdY\sinDirection\xybsqll@
  1166.  \kern\dimen@\squiggle@@
  1167.  \edef\tmp@{\egroup \Uc=\the\dimen@ii \Lc=\the\dimen@}\tmp@
  1168.  \wdz@=2\Lc \Rc=\Lc \ht\z@=\Uc \Dc=\Uc \dp\z@=\Uc \Edgec={\rectangleEdge}%
  1169.  \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
  1170.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@\squiggledSpread@}}
  1171. \xydef@\squiggle@@{\DirectionChar \count@=\DirectionChar
  1172.  \advance\count@-64 \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}
  1173. \xydef@\squiggledSpread@{%
  1174.  \dimen@=\dX \advance\dimen@-\sdX\count@@\A@ \advance\dimen@\sdX.3\p@
  1175.  \advance\Xc-.5\dimen@ \advance\dX-\dimen@
  1176.  \dimen@=\dY \advance\dimen@-\sdY\count@@\B@ \advance\dimen@\sdY.3\p@
  1177.  \advance\Yc-.5\dimen@ \advance\dY-\dimen@}
  1178. \xydef@\double@#1{\edef\Drop@@{\dimen@=#1\relax
  1179.  \dimen@=.5\dimen@ \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
  1180.  \setbox2=\hbox{\kern\A@\raise\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
  1181.  \setbox2=\hbox{\kern-\A@\raise-\B@\boxz@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2 }}
  1182. \xydef@\triple@#1{\edef\Drop@@{\dimen@=#1\relax
  1183.  \A@=-\sinDirection\dimen@ \B@=\cosDirection\dimen@
  1184.  \setbox2=\hbox{\kern\A@\raise\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
  1185.  \setbox2=\hbox{\kern-\A@\raise-\B@\copy\z@}\dp2=\z@ \ht2=\z@ \wd2=\z@ \box2
  1186.  \dp\z@=\z@ \ht\z@=\z@ \wdz@=\z@ \boxz@}}
  1187. \xydefcsname@{dir1{--}}{\dash@}
  1188. \xydefcsname@{dir2{--}}{\dash@ \double@\xydashh@}
  1189. \xydefcsname@{dir3{--}}{\dash@ \triple@\xydashh@}
  1190. \xyletcsnamecsname@{dir0{--}}{dir{}}
  1191. \xyletcsnamecsname@{dir{--}}{dir1{--}}
  1192. \xyletcsnamecsname@{dir{==}}{dir2{--}}
  1193. \xydef@\dash@{\line@ \wdz@=2\wdz@ \ht\z@=2\ht\z@ \dp\z@=2\dp\z@
  1194.  \multiply\Dc\tw@ \multiply\Uc\tw@ \multiply\Lc\tw@ \multiply\Rc\tw@
  1195.  \def\Connect@@{\straight@\dashedSpread@}}
  1196. \xydef@\dashedSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
  1197.  \advance\dX\sdX.5\A@ \advance\dY\sdY.5\B@
  1198.  \ifdim\z@<\dX \advance\Xc.5\A@ \fi \advance\Yc\sdY.5\B@}
  1199. \xydefcsname@{dir1{~~}}{\dashsquiggle@}
  1200. \xydefcsname@{dir2{~~}}{\dashsquiggle@ \double@\xybsqlh@}
  1201. \xydefcsname@{dir3{~~}}{\dashsquiggle@ \triple@\xybsqlh@}
  1202. \xyletcsnamecsname@{dir0{~~}}{dir{}}
  1203. \xyletcsnamecsname@{dir{~~}}{dir1{~~}}
  1204. \xydef@\dashsquiggle@{\squiggle@
  1205.  \multiply\Dc\tw@ \multiply\Uc\tw@ \multiply\Lc\tw@ \multiply\Rc\tw@
  1206.  \dimen@=\Lc \advance\dimen@\Rc \wdz@=\dimen@ \ht\z@=\Uc \dp\z@=\Dc
  1207.  \def\Connect@@{\straight@\dashsquiggledSpread@}}
  1208. \xydef@\dashsquiggledSpread@{\ifnum\z@<\count@@ \advance\count@@\@ne \fi
  1209.  \advance\Xc.5\A@ \advance\dX.5\A@ \advance\Yc.25\B@ \advance\dY.5\B@}
  1210. \xyletcsnamecsname@{dir1{..}}{dir{.}}
  1211. \xyletcsnamecsname@{dir2{..}}{dir2{.}}
  1212. \xyletcsnamecsname@{dir3{..}}{dir3{.}}
  1213. \xyletcsnamecsname@{dir{..}}{dir1{.}}
  1214. \xyletcsnamecsname@{dir{::}}{dir2{.}}
  1215. \xylet@\ctipEdge@=\czeroEdge@
  1216. \xydefcsname@{dir1{>}}{\tip@}
  1217. \xydefcsname@{dir^{>}}{\atip@}
  1218. \xydefcsname@{dir_{>}}{\btip@}
  1219. \xyletcsnamecsname@{dir0{>}}{dir{}}
  1220. \xyletcsnamecsname@{dir{>}}{dir1{>}}
  1221. \xydefcsname@{dir1{<}}{\reverseDirection@\tip@}
  1222. \xydefcsname@{dir^{<}}{\reverseDirection@\btip@}
  1223. \xydefcsname@{dir_{<}}{\reverseDirection@\atip@}
  1224. \xyletcsnamecsname@{dir0{<}}{dir{}}
  1225. \xyletcsnamecsname@{dir{<}}{dir1{<}}
  1226. \xydef@\tip@{\tip@x\tip@@}
  1227. \xydef@\atip@{\tip@x\atip@@}
  1228. \xydef@\btip@{\tip@x\btip@@}
  1229. \xydef@\tip@x#1{#1\egroup
  1230.  \ctipEdge@ \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
  1231.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
  1232. \xydef@\tip@@{\atip@@\btip@@}
  1233. \xydef@\atip@@{\xyatipfont\DirectionChar}
  1234. \xydef@\btip@@{\xybtipfont\DirectionChar}
  1235. \xydefcsname@{dir2{>}}{\Tip@}
  1236. \xydefcsname@{dir2{<}}{\reverseDirection@\Tip@}
  1237. \xydef@\Tip@{\kern2.5pt \vrule height2.5pt depth2.5pt width\z@
  1238.  \Tip@@ \kern2.5pt \egroup
  1239.  \Uc=2.5pt \Dc=2.5pt \Lc=2.5pt \Rc=2.5pt \Edgec={\circleEdge}%
  1240.  \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
  1241.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
  1242. \xydef@\Tip@@{\count@=\DirectionChar
  1243.  \advance\count@-4 \ifnum\count@<\z@ \advance\count@128 \fi
  1244.  \xyatipfont\char\count@
  1245.  \advance\count@ 8 \ifnum127<\count@ \advance\count@-128 \fi
  1246.  \xybtipfont\char\count@}
  1247. \xydefcsname@{dir3{>}}{\Ttip@}
  1248. \xydefcsname@{dir3{<}}{\reverseDirection@\Ttip@}
  1249. \xydef@\Ttip@{\kern3.2pt \vrule height3.2pt depth3.2pt width\z@
  1250.  \Ttip@@ \kern3.2pt \egroup
  1251.  \Uc=3.2pt \Dc=3.2pt \Lc=3.2pt \Rc=3.2pt \Edgec={\circleEdge}%
  1252.  \Invisible@false \Hidden@false \def\Leftness@{.5}\def\Upness@{.5}%
  1253.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@{\dottedSpread@\jot}}}
  1254. \xydef@\Ttip@@{%
  1255.  \setboxz@h\bgroup\reverseDirection@\line@ \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@
  1256.  \kern-\Lc \boxz@ \kern\Lc
  1257.  {\vDirection@(1,-.31)\xydashl@ \xyatipfont\char\DirectionChar}%
  1258.  {\vDirection@(1,+.31)\xydashl@ \xybtipfont\char\DirectionChar}}
  1259. \xydefcsname@{dir1{|}}{\stopper@}
  1260. \xydefcsname@{dir^{|}}{\aboveDirection@\xydashl@
  1261.  \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
  1262. \xydefcsname@{dir_{|}}{\belowDirection@\xydashl@
  1263.  \shiftdir@\line@\z@ \pointlike@{}\xydashh@}
  1264. \xydefcsname@{dir2{|}}{\stopper@ \double@\xydashh@}
  1265. \xydefcsname@{dir3{|}}{\stopper@ \double@{2\xydashh@}}
  1266. \xyletcsnamecsname@{dir0{|}}{dir{}}
  1267. \xyletcsnamecsname@{dir{|}}{dir1{|}}
  1268. \xydef@\stopper@{\tip@x\stopper@@}
  1269. \xydef@\stopper@@{\setboxz@h{\count@=\SemiDirectionChar \advance\count@64
  1270.  \ifnum127<\count@ \advance\count@-128 \fi \xydashfont\char\count@\/}%
  1271.  \setboxz@h{\kern-.5\wdz@ \dimen@=\sdY\cosDirection\xydashl@ 
  1272.  \ifnum\SemiDirectionChar=95 \dimen@=\sdX\sdY\dimen@ \fi
  1273.  \raise.5\dimen@\boxz@}%
  1274.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1275. \xydefcsname@{dir1{(}}{\hook@}
  1276. \xydefcsname@{dir^{(}}{\ahook@}
  1277. \xydefcsname@{dir_{(}}{\bhook@}
  1278. \xyletcsnamecsname@{dir0{(}}{dir{}}
  1279. \xyletcsnamecsname@{dir{(}}{dir1{(}}
  1280. \xydefcsname@{dir1{)}}{\reverseDirection@\hook@}
  1281. \xydefcsname@{dir^{)}}{\reverseDirection@\bhook@}
  1282. \xydefcsname@{dir_{)}}{\reverseDirection@\ahook@}
  1283. \xyletcsnamecsname@{dir0{)}}{dir{}}
  1284. \xyletcsnamecsname@{dir{)}}{dir1{)}}
  1285. \xydef@\hook@{\tip@x\hook@@}
  1286. \xydef@\hook@@{\setboxz@h{\xybsqlfont
  1287.  \vDirection@(1,-1){.707107\xybsqll@}%
  1288.  \hbox{\DirectionChar
  1289.  \kern-\dY\raise\dX\hbox{\count@=\DirectionChar \advance\count@-32
  1290.  \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
  1291.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1292. \xydef@\ahook@{\tip@x\ahook@@}
  1293. \xydef@\ahook@@{\setboxz@h{\xybsqlfont
  1294.  \vDirection@(1,-1){.707107\xybsqll@}\kern-\dX
  1295.  \lower\dY\hbox{\DirectionChar
  1296.  \kern-\dY\raise\dX\hbox{\count@=\DirectionChar \advance\count@-32
  1297.  \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}}%
  1298.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1299. \xydef@\bhook@{\tip@x\bhook@@}
  1300. \xydef@\bhook@@{\setboxz@h{\xybsqlfont
  1301.  \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar
  1302.  \kern\dX\raise\dY\hbox{\count@=\DirectionChar \advance\count@-96
  1303.  \ifnum\count@<\z@ \advance\count@128 \fi \char\count@}}%
  1304.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1305. \xydefcsname@{dir^{'}}{\reverseDirection@\bturn@}
  1306. \xydefcsname@{dir_{'}}{\reverseDirection@\aturn@}
  1307. \xydefcsname@{dir^{`}}{\aturn@}
  1308. \xydefcsname@{dir_{`}}{\bturn@}
  1309. \xydef@\aturn@{\tip@x\aturn@@}
  1310. \xydef@\aturn@@{\setboxz@h{\xybsqlfont
  1311.  \vDirection@(1,-1){.707107\xybsqll@}\kern-\dX
  1312.  \lower\dY\hbox{\DirectionChar}}%
  1313.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1314. \xydef@\bturn@{\tip@x\bturn@@}
  1315. \xydef@\bturn@@{\setboxz@h{\xybsqlfont
  1316.  \vDirection@(-1,-1){.707107\xybsqll@}\DirectionChar}%
  1317.  \wdz@=\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1318. \xydef@\newdir#1#{\newdir@{#1}}
  1319. \xydef@\newdir@#1#2#3{\xydefcsname@{dir#1{#2}}{\composite@{}{#3}}}
  1320. \xydef@\shiftdir@#1#2{%
  1321.  \setbox\z@=\hbox\bgroup#1\relax
  1322.  \setboxz@h{\dimen@ii=#2\relax
  1323.  \dimen@=-\cosDirection\dimen@ii \advance\dimen@-\Lc
  1324.  \kern\dimen@ \lower\sinDirection\dimen@ii\boxz@}%
  1325.  \wdz@\z@ \ht\z@=\z@ \dp\z@=\z@ \boxz@}
  1326. \xylet@\tipjot@=\jot
  1327. \xydefcsname@{dir1{>>}}{\shiftdir@\tip@\tipjot@ \tip@}
  1328. \xydefcsname@{dir^{>>}}{\shiftdir@\atip@\tipjot@ \atip@}
  1329. \xydefcsname@{dir_{>>}}{\shiftdir@\btip@\tipjot@ \btip@}
  1330. \xydefcsname@{dir2{>>}}{\composite@{}{h!/\tipjot@/\dir2{>}*\dir2{>}}}
  1331. \xydefcsname@{dir3{>>}}{\composite@{}{h!/\tipjot@/\dir3{>}*\dir3{>}}}
  1332. \xyletcsnamecsname@{dir0{>>}}{dir{}}
  1333. \xyletcsnamecsname@{dir{>>}}{dir1{>>}}
  1334. \xydefcsname@{dir1{<<}}{\reverseDirection@ \shiftdir@\tip@\tipjot@ \tip@}
  1335. \xydefcsname@{dir^{<<}}{\reverseDirection@ \shiftdir@\btip@\tipjot@ \btip@}
  1336. \xydefcsname@{dir_{<<}}{\reverseDirection@ \shiftdir@\atip@\tipjot@ \atip@}
  1337. \xydefcsname@{dir2{<<}}{\composite@{}{h!/-\tipjot@/\dir2{<}*\dir2{<}}}
  1338. \xydefcsname@{dir3{<<}}{\composite@{}{h!/-\tipjot@/\dir3{<}*\dir3{<}}}
  1339. \xyletcsnamecsname@{dir0{<<}}{dir{}}
  1340. \xyletcsnamecsname@{dir{<<}}{dir1{<<}}
  1341. \xydefcsname@{dir{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
  1342.  \pointlike@{}\jot}
  1343. \xydefcsname@{dir^{||}}{\shiftdir@{\aboveDirection@\xydashl@\line@}\xydashh@
  1344.  \shiftdir@{\aboveDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
  1345. \xydefcsname@{dir_{||}}{\shiftdir@{\belowDirection@\xydashl@\line@}\xydashh@
  1346.  \shiftdir@{\belowDirection@\xydashl@\line@}\z@ \pointlike@{}\jot}
  1347. \xydefcsname@{dir2{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
  1348.  \pointlike@{}\jot \double@\xydashh@}
  1349. \xydefcsname@{dir3{||}}{\shiftdir@\stopper@\xydashh@ \shiftdir@\stopper@\z@
  1350.  \pointlike@{}\jot \double@{2\xydashh@}}
  1351. \xydefcsname@{dir{>|}}{\shiftdir@\stopper@\z@ \tip@}
  1352. \xydefcsname@{dir{>>|}}{\shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
  1353. \xydefcsname@{dir{|<}}{\reverseDirection@ \shiftdir@\stopper@\z@ \tip@}
  1354. \xydefcsname@{dir{|<<}}{\reverseDirection@
  1355.  \shiftdir@\stopper@\z@ \shiftdir@\tip@\tipjot@ \tip@}
  1356. \xydefcsname@{dir{|-}}{\shiftdir@\stopper@\z@
  1357.  \shiftdir@\line@\z@ \pointlike@{}\jot}
  1358. \xydefcsname@{dir^{|-}}{\shiftdir@{\aboveDirection@\xydashl@ \line@}\z@
  1359.  \shiftdir@\line@\z@ \pointlike@{}\jot}
  1360. \xydefcsname@{dir_{|-}}{\shiftdir@{\belowDirection@\xydashl@ \line@}\z@
  1361.  \shiftdir@\line@\z@ \pointlike@{}\jot}
  1362. \xydefcsname@{dir2{|-}}{\shiftdir@\stopper@\z@
  1363.  \shiftdir@\line@\z@ \pointlike@{}\jot \double@\xydashh@}
  1364. \xydefcsname@{dir3{|-}}{\shiftdir@\stopper@\z@
  1365.  \shiftdir@\line@\z@ \pointlike@{}\jot \triple@\xydashh@}
  1366. \xyletcsnamecsname@{dir0{|=}}{dir{}}
  1367. \xyletcsnamecsname@{dir{|=}}{dir2{|-}}
  1368. \xydefcsname@{dir{+}}{%
  1369.  \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
  1370. \xydefcsname@{dir{x}}{\vDirection@(1,1)\jot
  1371.  \DN@##1{\composite@{}{##10\dir{|}*!C##10\dir{-}}}\addEQ@\next@}
  1372. \xydefcsname@{dir{/}}{\vDirection@(1,-.3)\jot \stopper@}
  1373. \xydefcsname@{dir{*}}{\solidpoint@}
  1374. \xydef@\solidpoint@{%
  1375.  \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\bullet$}}\jot}
  1376. \xydefcsname@{dir{o}}{\hollowpoint@}
  1377. \xydef@\hollowpoint@{%
  1378.  \pointlike@{\kern-1.8pt\lower1.8pt\hbox{$\scriptstyle\circ$}}\jot}
  1379. \message{circles,}
  1380. \xydef@\cir#1#{\hbox\bgroup
  1381.  \afterVECTORorEMPTY{\xy@@{\R@=\Xc}\cir@}{\xy@@{\R@=\Rc}\cir@}#1@}
  1382. \xydef@\cir@#1@#2{%
  1383.  \DN@{#1}\ifx\next@\empty\else \xyerror@{illegal circle <radius>: must be
  1384.  <vector> or <empty>}{}\fi
  1385.  \afterCIRorDIAG{\xyFN@\cir@cir}{\xyFN@\cir@diag}#2@}
  1386. \xydef@\cir@cir{%
  1387.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\cir@cir}%
  1388.  \else \ifx @\next \DN@ @{\cir@i}%
  1389.  \else \xyerror@{illegal <cir>: must have form <diag><orient><diag> or
  1390.  <empty>}{}%
  1391.  \fi\fi \next@}
  1392. \xydef@\cir@diag{%
  1393.  \DN@{\xyerror@{illegal <cir>: must have form <diag><orient><diag> or
  1394.  <empty>}{}}%
  1395.  \ifx @\next \ifnum\count@=8
  1396.  \DN@ @{\def\CIRin@@{0}\def\CIRorient@@{\CIRfull@}\def\CIRout@@{7}\cir@i}%
  1397.  \fi\fi \next@}
  1398. \xydef@\cir@i{%
  1399.  \ifnum\CIRin@@=8 \xyerror@{incomplete <cir> specification}{%
  1400. The <cir> you specified as <diag><orient><diag> is not sufficiently specific.}%
  1401.  \def\CIRin@@{0}\fi
  1402.  \ifdim\R@<.5\p@ \R@=\z@ \zerodot
  1403.  \else \CIRorient@@ \cirbuild@ \fi
  1404.  \Lc=\R@ \Rc=\R@ \Dc=\R@ \Uc=\R@ \def\Leftness@{.5}\def\Upness@{.5}%
  1405.  \def\Drop@@{\boxz@}\def\Connect@@{\straight@\relax}\Edgec={\circleEdge}%
  1406.  \OBJECT@x}
  1407. \xydef@\CIRin@@{3}
  1408. \xydef@\CIRout@@{3}
  1409. \xylet@\CIRorient@@=\empty
  1410. \xydef@\afterCIRorDIAG#1#2{\def\afterCIR@{#1}\def\afterCIRDIAG@{#2}\xyFN@\CIR@}
  1411. \xylet@\afterCIR@=\empty
  1412. \xylet@\afterCIRDIAG@=\empty
  1413. \xydef@\CIR@{\count@=8 \afterDIAG{\edef\CIRin@@{\the\count@}\xyFN@\CIR@@}}
  1414. \xydef@\CIR@@{%
  1415.  \ifx \space@\next \expandafter\DN@\space{\xyFN@\CIR@@}%
  1416.  \else\ifx ^\next
  1417.  \DN@ ^{\def\CIRorient@@{\CIRacw@}%
  1418.  \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
  1419.  \else\ifx _\next
  1420.  \DN@_{\def\CIRorient@@{\CIRcw@}%
  1421.  \afterDIAG{\edef\CIRout@@{\the\count@}\afterCIR@}}%
  1422.  \else
  1423.  \DN@{\def\CIRorient@@{\relax}\afterCIRDIAG@}%
  1424.  \fi\fi\fi \next@}
  1425. \xylet@\CIRtest@@=\relax
  1426. \xydef@\CIRlo@@{0}
  1427. \xydef@\CIRhi@@{0}
  1428. \xydef@\CIRfull@{\def\CIRtest@@##1##2{##2}}
  1429. \xydef@\cirbuild@{\cirrestrict@@ \multiply\count@8
  1430.  \circhar@0\circhar@7\kern\dimen@
  1431.  \circhar@1\circhar@6\kern\dimen@
  1432.  \circhar@2\circhar@5\kern\dimen@
  1433.  \circhar@3\circhar@4\kern\dimen@}
  1434. \xydef@\circhar@#1{%
  1435.  \setboxz@h{\circhar@@{#1}}\dimen@=\wdz@ \wdz@=\z@ \ht\z@=\R@ \dp\z@=\R@
  1436.  \CIRtest@@#1{\boxz@}\setbox\z@=\copy\voidb@x}
  1437. \xydef@\circhar@@#1{{\xycircfont \advance\count@#1\relax \char\count@}}
  1438. \xydef@\cirrestrict@@{\dimen@=\R@
  1439.  \ifdim\R@<8pt \count@=\dimen@ \divide\count@\p@ \advance\count@\m@ne
  1440.  \else\ifdim\R@<16pt \count@=\dimen@
  1441.  \dimen@=2\p@ \divide\count@\dimen@ \advance\count@3
  1442.  \else\ifdim\R@<32pt \count@=\dimen@
  1443.  \dimen@=4\p@ \divide\count@\dimen@ \advance\count@7
  1444.  \else \count@=15 \fi\fi\fi
  1445.  \R@=\p@
  1446.  \ifnum\count@<8 \multiply\R@\count@ \advance\R@\p@
  1447.  \else\ifnum\count@<12 \multiply\R@\count@ \multiply\R@\tw@ \advance\R@-6\p@
  1448.  \else\ifnum\count@<16 \multiply\R@\count@ \multiply\R@ 4 \advance\R@-28\p@
  1449.  \else \multiply\R@ 32 \fi\fi\fi}
  1450. \xydef@\CIRacw@{\count@@=\CIRin@@ \count@=\CIRout@@
  1451.  \ifnum\count@=8 \count@=\count@@
  1452.  \ifnum\count@<6 \advance\count@\tw@ \else \advance\count@-6 \fi \fi
  1453.  \ifnum\count@@<\@ne \advance\count@@7 \else \advance\count@@\m@ne \fi
  1454.  \ifnum\count@<\@ne \advance\count@7 \else \advance\count@\m@ne \fi
  1455.  \ifnum\count@@>\count@ \let\CIRtest@@=\CIRtest@outside
  1456.  \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
  1457.  \else \let\CIRtest@@=\CIRtest@inside
  1458.  \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
  1459.  \fi}
  1460. \xydef@\CIRcw@{\count@@=\CIRin@@ \count@=\CIRout@@
  1461.  \ifnum\count@=8 \count@=\count@@
  1462.  \ifnum\count@>\@ne \advance\count@-\tw@ \else \advance\count@6 \fi \fi
  1463.  \ifnum\count@@<5 \advance\count@@\thr@@ \else \advance\count@@-5 \fi
  1464.  \ifnum\count@<5 \advance\count@\thr@@ \else \advance\count@-5 \fi
  1465.  \ifnum\count@@<\count@ \let\CIRtest@@=\CIRtest@outside
  1466.  \edef\CIRlo@@{\the\count@@}\edef\CIRhi@@{\the\count@}%
  1467.  \else \let\CIRtest@@=\CIRtest@inside
  1468.  \edef\CIRlo@@{\the\count@}\edef\CIRhi@@{\the\count@@}%
  1469.  \fi}
  1470. \xydef@\CIRtest@inside#1#2{\let\next@=\relax
  1471.  \ifnum\CIRlo@@>#1\else \ifnum#1<\CIRhi@@\DN@{#2}\fi\fi \next@}
  1472. \xydef@\CIRtest@outside#1#2{\let\next@=\relax
  1473.  \ifnum\CIRlo@@>#1\DN@{#2}\else \ifnum#1<\CIRhi@@\else\DN@{#2}\fi\fi \next@}
  1474. \message{text;}
  1475. \xydef@\txt{\hbox\bgroup \xyFN@\txt@}
  1476. \xydef@\txt@{%
  1477.  \addLT@\ifx\next \addGT@{\addLT@\DN@##1}{\A@=##1\txt@i}%
  1478.  \else \DN@{\A@=\maxdimen \txt@i}\fi \next@}
  1479. \xydef@\txt@i#1#{%
  1480.  \setboxz@h{#1\mathstrut}\dimen@=\ht\z@ \advance\dimen@\dp\z@
  1481.  \baselineskip=1.1\dimen@ \lineskip=.2\dimen@ \lineskiplimit=\lineskip
  1482.  \def\txtline@@##1{\txtline@{#1}{##1}}\object@\txt@ii}
  1483. \xylet@\txtline@@=\eat@
  1484. \xydef@\txtline@#1#2{\relax\setboxz@h{#1\ignorespaces #2\unskip}%
  1485.  \ifdim\A@<\wdz@ \setboxz@h{\hsize=\A@
  1486.  \leftskip=0pt plus4em \rightskip=\leftskip
  1487.  \parfillskip=0pt \parindent=0pt
  1488.  \spaceskip=.3333em \xspaceskip=.5em
  1489.  \pretolerance=9999 \tolerance=9999
  1490.  \hyphenpenalty=9999 \exhyphenpenalty=9999
  1491.  \vbox{#1\noindent\ignorespaces #2\unskip}}%
  1492.  \else\ifdim\A@<\maxdimen\setboxz@h to\A@{\hfil\boxz@\hfil}\fi\fi
  1493.  \boxz@}
  1494. \xydef@\txt@ii#1{\vbox{%
  1495.  \let\\=\cr
  1496.  \tabskip=\z@skip \halign{\relax\hfil\txtline@@{##}\hfil\cr#1\crcr}}}
  1497. \message{options;}
  1498. \xylet@\xyoption@@=\relax
  1499. \xydef@\xyoption#1{\xyinputorelse@{xy#1}%
  1500.  {\DN@{#1}\edef\next@{\codeof\next@}\xyerror@{No `\next@' option}{%
  1501. Your \string\xyoption\string{\next@\string} request could not be granted: the
  1502. required^^J%
  1503. file `xy\next@.tex' could not be located. Please make sure that it is^^J%
  1504. properly installed before continuing.}}%
  1505.  \def\xyoption@@{#1}\edef\xyoption@@{\codeof\xyoption@@}\xywith@@
  1506.  \ignorespaces}
  1507. \xydef@\xyrequire#1{\DN@{#1}%
  1508.  \expandafter\let\expandafter\next@\csname xy\codeof\next@ loaded\endcsname
  1509.  \ifx \next@\relax \DN@{\xyoption{#1}}\else \DN@{}\fi \next@}
  1510. \xylet@\xywith@@=\empty
  1511. \xydef@\xywithoption#1#2{\DN@{#1}%
  1512.  \expandafter\let\expandafter\next@\csname xy\codeof\next@ loaded\endcsname
  1513.  \ifx \next@\relax
  1514.  \expandafter\def\expandafter\xywith@@\expandafter{\xywith@@
  1515.  \DN@{#1}\edef\next@{\codeof\next@}%
  1516.  \ifx\next@\xyoption@@ \DN@{#2}%
  1517.  \else \let\next@=\relax \fi \next@}%
  1518.  \else \DN@{#2}\fi \next@}
  1519. \xydef@\xyprovide#1#2#3#4#5#6{%
  1520.  \def\next{#1}\edef\next{\codeof\next}\edef\next@{#3}%
  1521.  \message{XY-pic option: #2 v.\next@}%
  1522.  \expandafter\let\expandafter\nextii@\csname xy\next loaded\endcsname
  1523.  \ifx \next@\nextii@ \message{not reloaded}\endinput
  1524.  \else
  1525.  \ifx \nextii@\relax\else \xyerror@{Option `\next' version mismatch}{%
  1526. You previously loaded, or the format has preloaded, a different version^^J%
  1527. of this option. Just hit return to try to load this version instead (and^^J%
  1528. be prepared for a lot of warnings about redefinitions).}%
  1529.  \fi
  1530.  \expandafter\let\csname xy\next loaded\endcsname=\next@
  1531.  \expandafter\let\expandafter\xyenddocmode@\csname DOCMODE\endcsname
  1532.  \expandafter\let\csname DOCMODE\endcsname\xyprovidedocmode@
  1533.  \xycatcodes
  1534.  \fi \ignorespaces}
  1535. \xydef@\xyendinput{\expandafter\let\csname DOCMODE\endcsname=\xyenddocmode@
  1536.  \message{loaded}\xyuncatcodes\endinput}
  1537. \expandafter\xylet@\expandafter\xyprovidedocmode@\csname DOCMODE\endcsname
  1538. \xylet@\xyenddocmode@=\relax
  1539. \message{algorithms: directions,}
  1540. \xydef@\DirectionfromtheDirection@{\noexpand\Direction=\the\Direction
  1541.  \noexpand\dX=\the\dX \noexpand\dY=\the\dY
  1542.  \def\noexpand\sdX{\sdX}\def\noexpand\sdY{\sdY}%
  1543.  \noexpand\K@dXdY=\the\K@dXdY \noexpand\K@dYdX=\the\K@dYdX
  1544.  \chardef\noexpand\DirectionChar=\the\DirectionChar
  1545.  \chardef\noexpand\SemiDirectionChar=\the\SemiDirectionChar
  1546.  \def\noexpand\cosDirection{\cosDirection}%
  1547.  \def\noexpand\sinDirection{\sinDirection}%
  1548.  \noexpand\resetupDirection@}
  1549. \xydef@\Directiontest@@#1#2{#2}
  1550. \xydef@\setupDirection@{%
  1551.  \dX=\Xc\advance\dX-\Xp \dY=\Yc\advance\dY-\Yp
  1552.  \Directiontest@@\relax\setupDirection@i}
  1553. \xydef@\setupDirection@i{\DN@{\setupDirection@ii}%
  1554.  \ifdim\dX=\dY
  1555.  \ifdim\dY=\z@ \DN@{}%
  1556.  \else\ifdim\dX<\z@ \DN@{\dlDirection@{-1.4142\dX}}%
  1557.  \else \DN@{\urDirection@{1.4142\dX}}\fi\fi
  1558.  \else\ifdim\dX<\dY
  1559.  \ifdim\dX=\z@ \DN@{\uDirection@\dY}%
  1560.  \else\ifdim\dY=\z@ \DN@{\lDirection@{-\dX}}%
  1561.  \else\ifdim-\dX=\dY \DN@{\ulDirection@{-1.4142\dX}}\fi\fi\fi
  1562.  \else
  1563.  \ifdim\dX=\z@ \DN@{\dDirection@{-\dY}}%
  1564.  \else\ifdim\dY=\z@ \DN@{\rDirection@\dX}%
  1565.  \else\ifdim\dX=-\dY \DN@{\drDirection@{1.4142\dX}}\fi\fi\fi
  1566.  \fi\fi \next@}
  1567. \xydef@\dlDirection@{\Direction=\z@
  1568.  \def\cosDirection{-.7071}\def\sinDirection{-.7071}\def\sdX{-}\def\sdY{-}%
  1569.  \chardef\DirectionChar=127\relax\chardef\SemiDirectionChar=127\relax
  1570.  \K@dXdY=1\K \K@dYdX=1\K \fixedDirection@}
  1571. \xydef@\dDirection@{\Direction=\K
  1572.  \def\cosDirection{0}\def\sinDirection{-1}\def\sdX{+}\def\sdY{-}%
  1573.  \chardef\DirectionChar=15\relax\chardef\SemiDirectionChar=31\relax
  1574.  \K@dXdY=\z@ \K@dYdX=\KK@\K \fixedDirection@}
  1575. \xydef@\drDirection@{\dimen@ii=2\K \Direction=\dimen@ii
  1576.  \def\cosDirection{+.7071}\def\sinDirection{-.7071}\def\sdX{+}\def\sdY{-}%
  1577.  \chardef\DirectionChar=31\relax\chardef\SemiDirectionChar=63\relax
  1578.  \K@dXdY=-1\K \K@dYdX=-1\K \fixedDirection@}
  1579. \xydef@\rDirection@{\dimen@ii=3\K \Direction=\dimen@ii
  1580.  \def\cosDirection{+1}\def\sinDirection{0}\def\sdX{+}\def\sdY{+}%
  1581.  \chardef\DirectionChar=47\relax\chardef\SemiDirectionChar=95\relax
  1582.  \K@dXdY=\KK@\K \K@dYdX=\z@ \fixedDirection@}
  1583. \xydef@\urDirection@{\dimen@ii=4\K \Direction=\dimen@ii
  1584.  \def\cosDirection{+.7071}\def\sinDirection{+.7071}\def\sdX{+}\def\sdY{+}%
  1585.  \chardef\DirectionChar=63\relax\chardef\SemiDirectionChar=127\relax
  1586.  \K@dXdY=1\K \K@dYdX=1\K \fixedDirection@}
  1587. \xydef@\uDirection@{\dimen@ii=-3\K \Direction=\dimen@ii
  1588.  \def\cosDirection{0}\def\sinDirection{+1}\def\sdX{+}\def\sdY{+}%
  1589.  \chardef\DirectionChar=79\relax\chardef\SemiDirectionChar=31\relax
  1590.  \K@dXdY=\z@ \K@dYdX=\KK@\K \fixedDirection@}
  1591. \xydef@\ulDirection@{\dimen@ii=-2\K \Direction=\dimen@ii
  1592.  \def\cosDirection{-.7071}\def\sinDirection{+.7071}\def\sdX{-}\def\sdY{+}%
  1593.  \chardef\DirectionChar=95\relax\chardef\SemiDirectionChar=63\relax
  1594.  \K@dXdY=-1\K \K@dYdX=-1\K \fixedDirection@}
  1595. \xydef@\lDirection@{\Direction=-\K
  1596.  \def\cosDirection{-1}\def\sinDirection{0}\def\sdX{-}\def\sdY{+}%
  1597.  \chardef\DirectionChar=111\relax\chardef\SemiDirectionChar=95\relax
  1598.  \K@dXdY=\KK@\K \K@dYdX=\z@ \fixedDirection@}
  1599. \xydef@\fixedDirection@#1{\dimen@ii=#1\relax
  1600.  \dX=\cosDirection\dimen@ii \dY=\sinDirection\dimen@ii
  1601.  \resetupDirection@}
  1602. \xydef@\setupDirection@ii{%
  1603.  \ifdim\dX<\z@ \def\sdX{-}\else \def\sdX{+}\fi
  1604.  \ifdim\dY<\z@ \def\sdY{-}\else \def\sdY{+}\fi
  1605.  \K@dXdY=\sdX\dX \ifdim\K@dXdY<500pt \multiply\K@dXdY\KK@ \fi \dimen@=\sdY\dY
  1606.  \advance\dimen@.5\KK@ \divide\dimen@\KK@
  1607.  \ifdim\dimen@=\z@\else
  1608.  \advance\K@dXdY by.5\dimen@\relax \divide\K@dXdY\dimen@
  1609.  \fi \K@dXdY=\sdX\sdY\K@dXdY
  1610.  \K@dYdX=\sdY\dY \ifdim\K@dYdX<500pt \multiply\K@dYdX\KK@ \fi \dimen@=\sdX\dX
  1611.  \advance\dimen@.5\KK@ \divide\dimen@\KK@
  1612.  \ifdim\dimen@=\z@\else
  1613.  \advance\K@dYdX by.5\dimen@\relax \divide\K@dYdX\dimen@
  1614.  \fi \K@dYdX=\sdX\sdY\K@dYdX
  1615.  \Direction=\maxdimen
  1616.  \ifnum\K@dXdY<-\K \else \ifnum\K<\K@dXdY \else
  1617.  \ifdim \dY<\z@
  1618.  \Direction=\K \advance\Direction-\K@dXdY
  1619.  \else
  1620.  \Direction=\K \multiply\Direction-\thr@@ \advance\Direction-\K@dXdY
  1621.  \fi\fi\fi
  1622.  \ifnum-\K<\K@dYdX \ifnum\K@dYdX<\K
  1623.  \ifdim \dX<\z@
  1624.  \Direction=-\K \advance\Direction\K@dYdX
  1625.  \else
  1626.  \Direction=\K \multiply\Direction\thr@@ \advance\Direction\K@dYdX
  1627.  \fi\fi\fi
  1628.  \ifnum\Direction=\maxdimen
  1629.  \Direction=\K@dYdX \advance\Direction-\K@dXdY \divide\Direction\tw@ 
  1630.  \ifnum\K@dXdY<\z@ \advance\Direction\K \advance\Direction\K
  1631.  \else \advance\Direction-\K \advance\Direction-\K \fi
  1632.  \fi
  1633.  \count@@=\K \multiply\count@@ by8 \advance\count@@\Direction
  1634.  \count@=\count@@ \advance\count@\KK@ \divide\count@64 \advance\count@\m@ne
  1635.  \loop@\ifnum127<\count@ \advance\count@-128 \repeat@
  1636.  \chardef\DirectionChar\count@
  1637.  \advance\count@@16 \divide\count@@\KK@ \advance\count@@\m@ne
  1638.  \loop@\ifnum127<\count@@ \advance\count@@-128 \repeat@
  1639.  \chardef\SemiDirectionChar\count@@
  1640.  \setbox8=\hbox{\xydashfont\SemiDirectionChar\/}%
  1641.  \quotient@@\cosDirection{\sdX\wd8}\xydashl@
  1642.  \setbox8=\hbox{\xydashfont\count@=\SemiDirectionChar\advance\count@-64
  1643.  \ifnum\count@<\z@ \advance\count@128 \fi \char\count@\/}%
  1644.  \quotient@@\sinDirection{\sdY\wd8}\xydashl@
  1645.  \resetupDirection@
  1646. }
  1647. \xydef@\reverseDirection@{%
  1648.  \dX=-\dX \dY=-\dY
  1649.  \ifdim\dX<\z@ \def\sdX{-}\else \def\sdX{+}\fi
  1650.  \ifdim\dY<\z@ \def\sdY{-}\else \def\sdY{+}\fi
  1651.  \dimen@=4\K \ifnum\Direction<\z@ \advance\Direction\dimen@
  1652.  \else \advance\Direction-\dimen@ \fi
  1653.  \count@=\DirectionChar \ifnum\count@<64 \advance\count@64
  1654.  \else \advance\count@-64 \fi \chardef\DirectionChar=\count@
  1655.  \edef\cosDirection{\if-\cosDirection\else-\cosDirection\fi}%
  1656.  \edef\sinDirection{\if-\sinDirection\else-\sinDirection\fi}%
  1657.  \resetupDirection@}
  1658. \xydef@\aboveDirection@#1{%
  1659.  \dimen@=\dX \dX=-\dY \dY=\dimen@
  1660.  \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
  1661.  \ifdim\dX<\z@ \def\sdX{-}\else \def\sdX{+}\fi
  1662.  \ifdim\dY<\z@ \def\sdY{-}\else \def\sdY{+}\fi
  1663.  \dimen@=2\K \ifdim 1\Direction<\dimen@\else \dimen@=-6\K \fi
  1664.  \advance\Direction\dimen@
  1665.  \count@=\DirectionChar \ifnum\count@<96 \advance\count@32
  1666.  \else \advance\count@-96 \fi \chardef\DirectionChar=\count@
  1667.  \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
  1668.  \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
  1669.  \let\tmp@=\cosDirection
  1670.  \edef\cosDirection{\if-\sinDirection\else-\sinDirection\fi}%
  1671.  \let\sinDirection=\tmp@
  1672.  \dimen@=#1\relax \dX=\cosDirection\dimen@ \dY=\sinDirection\dimen@
  1673.  \resetupDirection@}
  1674. \xydef@\belowDirection@#1{%
  1675.  \dimen@=\dX \dX=\dY \dY=-\dimen@
  1676.  \dimen@=\K@dXdY \K@dXdY=-\K@dYdX \K@dYdX=-\dimen@
  1677.  \ifdim\dX<\z@ \def\sdX{-}\else \def\sdX{+}\fi
  1678.  \ifdim\dY<\z@ \def\sdY{-}\else \def\sdY{+}\fi
  1679.  \dimen@=-2\K\ifdim 1\Direction<\dimen@\dimen@=6\K\fi \advance\Direction\dimen@
  1680.  \count@=\DirectionChar \ifnum\count@<32 \advance\count@96
  1681.  \else \advance\count@-32 \fi \chardef\DirectionChar=\count@
  1682.  \count@=\SemiDirectionChar \ifnum\count@<64 \advance\count@64
  1683.  \else \advance\count@-64 \fi \chardef\SemiDirectionChar=\count@
  1684.  \let\tmp@=\sinDirection
  1685.  \edef\sinDirection{\if-\cosDirection\else-\cosDirection\fi}%
  1686.  \let\cosDirection=\tmp@
  1687.  \dimen@=#1\relax \dX=\cosDirection\dimen@ \dY=\sinDirection\dimen@
  1688.  \resetupDirection@}
  1689. \xydef@\vDirection@(#1,#2)#3{\dimen@ii=#3\relax
  1690.  \dimen@=#1\dimen@ii \dimen@ii=#2\dimen@ii
  1691.  \dX=\cosDirection\dimen@ \advance\dX-\sinDirection\dimen@ii
  1692.  \dY=\sinDirection\dimen@ \advance\dY \cosDirection\dimen@ii
  1693.  \Xp=\Xc \advance\Xp-\dX \Yp=\Yc \advance\Yp-\dY
  1694.  \setupDirection@\ignorespaces}
  1695. \xydef@\resetDirection@{%
  1696.  \dX=\Xc\advance\dX-\Xp \dY=\Yc\advance\dY-\Yp \let\next@=\resetupDirection@
  1697.  \ifdim\sdX\dX<\z@ \let\next@=\setupDirection@i \fi
  1698.  \ifdim\sdY\dY<\z@ \let\next@=\setupDirection@i \fi
  1699.  \next@}
  1700. \xydef@\resetupDirection@{%
  1701.  \edef\Directiontest@@##1##2{\noexpand\DN@{##2}%
  1702.  \noexpand\ifdim\noexpand\dX=\the\dX\relax
  1703.  \noexpand\ifdim\noexpand\dY=\the\dY\relax \noexpand\DN@{##1}%
  1704.  \noexpand\fi\noexpand\fi \noexpand\next@}}
  1705. \xydef@\unsetupDirection@{\def\Directiontest@@##1##2{##2}}
  1706. \uDirection@\xydashl@
  1707. \message{edges,}
  1708. \xynew@{if}\ifInside@
  1709. \xydef@\zeroEdge#1{%
  1710.  \ifcase#1\relax \or \Inside@false \or \dimen@=\z@
  1711.  \or \or \else \Edgec={\rectangleEdge}\fi}
  1712. \xydef@\circleEdge#1{\ifcase#1\expandafter\circleEdge@
  1713.  \or \expandafter\circleUnder@ \or \dimen@=\Rc
  1714.  \or \expandafter\circleEdge@ \or \expandafter\circleInner@
  1715.  \else \expandafter\circleOuter@ \fi}
  1716. \xydef@\circleEdge@{%
  1717.  \dimen@=-\cosDirection\Rc \advance\Xc\dimen@
  1718.  \dimen@=-\sinDirection\Rc \advance\Yc\dimen@}
  1719. \xydef@\circleUnder@{\Inside@false
  1720.  \ifdim\Xp=\Xc \relax \ifdim\Yp=\Yc \Inside@true \fi \fi 
  1721.  \ifInside@ \else \expandafter \circleCentre@ \fi }
  1722. \xydef@\circleCentre@{{%
  1723.  \ifdim\Lc=\Rc \relax\else
  1724.  \dimen@=\Rc\advance\dimen@-\Lc \divide\dimen@\tw@
  1725.  \advance\Xc\dimen@ \advance\Rc-\dimen@ \fi
  1726.  \dX=\Xc \advance\dX-\Xp \dX=\ifdim\dX<\z@-\fi\dX
  1727.  \ifdim\Uc=\Dc\relax \else
  1728.  \dimen@=\Uc\advance\dimen@-\Dc \divide\dimen@\tw@
  1729.  \advance\Yc\dimen@ \advance\Uc-\dimen@ \fi
  1730.  \dY=\Yc \advance\dY-\Yp \dY=\ifdim\dY<\z@-\fi\dY
  1731.  \DN@{}\ifdim\dX>\Rc \relax \else \ifdim\dY>\Uc \relax 
  1732.  \else \ifdim\Uc=\Rc \DN@{\circleUnder@@}%
  1733.  \else \DN@{\ellipseUnder@@}\fi
  1734.  \fi\fi \next@ }}
  1735. \xydef@\circleUnder@@{%
  1736.  \loop\ifdim\Rc>100\p@ \circlescale@ \repeat
  1737.  \edef\tmp@{\expandafter\removePT@\the\Rc}\dimen@=\tmp@\Rc 
  1738.  \edef\tmp@{\expandafter\removePT@\the\dX}\advance\dimen@-\tmp@\dX
  1739.  \edef\tmp@{\expandafter\removePT@\the\dY}\advance\dimen@-\tmp@\dY
  1740.  \ifdim\dimen@>\z@ \aftergroup\Inside@true \fi }
  1741. \xydef@\circlescale@{\divide\Rc\KK@ \divide\dX\KK@ \divide\dY\KK@ }
  1742. \xydef@\ellipseUnder@@{%
  1743.  \ifdim\Rc>64\p@ \circlescale@ \divide\Uc\KK@ 
  1744.  \else \ifdim\Uc>64\p@ \circlescale@ \divide\Uc\KK@ \fi\fi
  1745.  \edef\tmp@{\expandafter\removePT@\the\Rc}\dY=\tmp@\dY 
  1746.  \edef\tmp@{\expandafter\removePT@\the\Uc}\dX=\tmp@\dX 
  1747.  \Rc=\tmp@\Rc \circleUnder@@ }
  1748. \xydef@\circleInner@{%
  1749.  \Lc=\sdX\cosDirection\Rc \Dc=\sdY\sinDirection\Rc
  1750.  \Rc=\Lc \Uc=\Dc \Edgec={\rectangleEdge}}
  1751. \xydef@\circleOuter@{%
  1752.  \Lc=\Rc \Dc=\Rc \Uc=\Dc \Edgec={\rectangleEdge}}
  1753. \xydef@\rectangleEdge#1{\ifcase#1\expandafter\rectangleEdge@
  1754.  \or \expandafter\rectangleUnder@ \or \expandafter\rectangleWidth@
  1755.  \or \expandafter\rectangleProp@
  1756.  \else \relax \fi}
  1757. \xydef@\rectangleEdge@{%
  1758.  \ifdim\dY<-.05\p@ \rectangleEdge@i
  1759.  \else\ifdim\dY<.05\p@ \rectangleEdge@ii
  1760.  \else \rectangleEdge@iii\fi\fi
  1761.  \resetupDirection@}
  1762. \xydef@\rectangleEdge@i{%
  1763.  \ifdim\dX<-.05\p@ \settomin@\Xc+\Rc\Uc\dX\dY \settomin@\Yc+\Uc\Rc\dY\dX%1a
  1764.  \else\ifdim\dX<.05\p@ \advance\Yc\Uc
  1765.  \else \settomin@\Xc-\Lc\Uc\dX\dY \settomin@\Yc+\Uc\Lc\dY\dX
  1766.  \fi\fi}
  1767. \xydef@\rectangleEdge@ii{%
  1768.  \ifdim\dX<-.05\p@ \advance\Xc\Rc
  1769.  \else\ifdim\dX<.05\p@
  1770.  \else \advance\Xc-\Lc
  1771.  \fi\fi}
  1772. \xydef@\rectangleEdge@iii{%
  1773.  \ifdim\dX<-.05\p@ \settomin@\Xc+\Rc\Dc\dX\dY \settomin@\Yc-\Dc\Rc\dY\dX%3a
  1774.  \else\ifdim\dX<.05\p@ \advance\Yc-\Dc
  1775.  \else \settomin@\Xc-\Lc\Dc\dX\dY \settomin@\Yc-\Dc\Lc\dY\dX
  1776.  \fi\fi}
  1777. \xydef@\settomin@#1#2#3#4#5#6{%
  1778.  \edef\nextii@{\A@=\the\A@ \B@=\the\B@}\quotient@\next@{#5}{#6}\nextii@
  1779.  \dimen@=\sdX\sdY\next@#4\relax
  1780.  \ifdim#3<\dimen@ \dimen@=#3\fi \advance#1#2\dimen@}
  1781. \xydef@\rectangleUnder@{\Inside@false
  1782.  \ifdim\Xp=\Xc \ifdim\Yp=\Yc \Inside@true \fi\fi 
  1783.  \ifInside@ \else
  1784.  \dimen@=\Xp \advance\dimen@-\Xc 
  1785.  \ifdim \dimen@>-\Lc \relax \ifdim\dimen@<\Rc 
  1786.  \dimen@=\Yp \advance\dimen@-\Yc 
  1787.  \ifdim \dimen@>-\Dc \relax \ifdim\dimen@<\Uc 
  1788.  \Inside@true 
  1789.  \fi\fi\fi\fi\fi }
  1790. \xydef@\rectangleWidth@{\let\next@=\rectangleWidth@i
  1791.  \ifdim\dX<-.05\p@ \A@=\Rc
  1792.  \else\ifdim\dX<.05\p@ \A@=\z@ \DN@{\dimen@=\B@}%
  1793.  \else \A@=\Lc \fi\fi
  1794.  \ifdim\dY<-.05\p@ \B@=\Uc
  1795.  \else\ifdim\dY<.05\p@ \DN@{\dimen@=\A@}%
  1796.  \else \B@=\Dc \fi\fi
  1797.  \next@}
  1798. \xydef@\rectangleWidth@i{%
  1799.  \begingroup
  1800.  \dimen@=\sdX\cosDirection\B@
  1801.  \quotient@\next\dimen@{\sdY\sinDirection\p@}\dimen@=\next\dimen@
  1802.  \edef\next{\endgroup \dimen@=\the\dimen@}%
  1803.  \ifdim\dimen@<\B@ \B@=\the\dimen@ \fi
  1804.  \begingroup
  1805.  \dimen@=\sdY\sinDirection\A@
  1806.  \quotient@\next\dimen@{\sdX\cosDirection\p@}\dimen@=\next\dimen@
  1807.  \edef\next{\endgroup \dimen@=\the\dimen@}%
  1808.  \ifdim\dimen@<\A@ \A@=\the\dimen@ \fi
  1809.  \dimen@=\sdX\cosDirection\A@ \advance\dimen@\sdY\sinDirection\B@}
  1810. \xydef@\rectangleProp@{%
  1811.  \enter@{\A@=\the\A@ \B@=\the\B@ \DirectionfromtheDirection@}%
  1812.  \reverseDirection@
  1813.  \dimen@=1\Direction \count@=\K \multiply\count@\tw@
  1814.  \ifnum \Direction>\count@
  1815.  \DN@{0}%
  1816.  \advance\dimen@-2\K \quotient@\nextii@{\dimen@}{2\K}%
  1817.  \else\ifnum \Direction>\z@
  1818.  \dimen@=-\dimen@ \advance\dimen@2\K \quotient@\next@{\dimen@}{2\K}%
  1819.  \DNii@{0}%
  1820.  \else\ifnum \Direction>-\count@
  1821.  \DN@{1}%
  1822.  \quotient@\nextii@{-\dimen@}{2\K}%
  1823.  \else
  1824.  \advance\dimen@4\K \quotient@\next@{\dimen@}{2\K}%
  1825.  \DNii@{1}%
  1826.  \fi\fi\fi
  1827.  \advance\Xc-\Lc \dimen@=\Lc \advance\dimen@\Rc 
  1828.  \ifdim\dimen@=\z@ \advance\Xc 2\Lc \else \advance\Xc\next@\dimen@ \fi
  1829.  \advance\Yc+\Uc \dimen@=\Dc \advance\dimen@\Uc 
  1830.  \ifdim\dimen@=\z@ \advance\Yc-2\Uc \advance\Yc\Upness@\Uc
  1831.  \else \advance\Yc-\nextii@\dimen@ \fi
  1832.  \leave@}
  1833. \message{connections;}
  1834. \xydef@\Creset@@{}
  1835. \xydef@\Cshavep@@{\noCshavep@@}
  1836. \xydef@\Cshavec@@{\noCshavec@@}
  1837. \xydef@\Cslidep@@{\noCslidep@@}
  1838. \xydef@\Cslidec@@{\noCslidec@@}
  1839. \xydef@\Calong@@{\noCalong@@}
  1840. \xydef@\no@@{\setupDirection@
  1841.  \edef\Creset@@{\cfromthec@ \pfromthep@ \noexpand\setupDirection@}%
  1842.  \def\Cshavep@@{\noCshavep@@}\def\Cshavec@@{\noCshavec@@}%
  1843.  \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
  1844.  \def\Calong@@{\noCalong@@}%
  1845.  \ifHidden@\else
  1846.  \ifdim\Yc>\Ymax \Ymax=\Yc \fi \ifdim\Yp>\Ymax \Ymax=\Yp \fi
  1847.  \ifdim\Yc<\Ymin \Ymin=\Yc \fi \ifdim\Yp<\Ymin \Ymin=\Yp \fi
  1848.  \ifdim\Xc>\Xmax \Xmax=\Xc \fi \ifdim\Xp>\Xmax \Xmax=\Xp \fi
  1849.  \ifdim\Xc<\Xmin \Xmin=\Xc \fi \ifdim\Xp<\Xmin \Xmin=\Xp \fi \fi}
  1850. \xydef@\noCshavep@@{\setupDirection@
  1851.  \enter@{\cfromthec@ \DirectionfromtheDirection@}%
  1852.  \reverseDirection@ \cfromp@ \the\Edgec\z@
  1853.  \pfromc@ \leave@ \resetDirection@}
  1854. \xydef@\noCshavec@@{\setupDirection@ \the\Edgec\z@ \resetDirection@}
  1855. \xydef@\noCslidep@@#1{\dimen@=#1\relax
  1856.  \advance\Xp\cosDirection\dimen@ \advance\Yp\sinDirection\dimen@
  1857.  \resetDirection@}
  1858. \xydef@\noCslidec@@#1{\dimen@=#1\relax
  1859.  \advance\Xc\cosDirection\dimen@ \advance\Yc\sinDirection\dimen@
  1860.  \resetDirection@}
  1861. \xydef@\noCalong@@#1{%
  1862.  \dX=#1\dX \dY=#1\dY \Xc=\Xp \Yc=\Yp \advance\Xc\dX \advance\Yc\dY
  1863.  \resetupDirection@}
  1864. \xydef@\Spread@@{}
  1865. \xydef@\checkoverlap@@{}
  1866. \xydef@\straight@#1{\setupDirection@ \def\Spread@@{#1}%
  1867.  \edef\Creset@@{\cfromthec@ \pfromthep@ \DirectionfromtheDirection@}%
  1868.  \DN@##1##2{\def\checkoverlap@@{%
  1869.  \ifdim##1\Xp>##1\Xc \let\next@=\relax \fi
  1870.  \ifdim##2\Yp>##2\Yc \let\next@=\relax \fi}}%
  1871.  \edef\nextii@{{\sdX}{\sdY}}\expandafter\next@\nextii@
  1872.  \noCshavep@@\edef\Cshavep@@{\pfromthep@ \noexpand\resetDirection@}%
  1873.  \noCshavec@@\edef\Cshavec@@{\cfromthec@ \noexpand\resetDirection@}%
  1874.  \ifHidden@\else
  1875.  \ifdim\Yc>\Ymax \Ymax=\Yc \fi \ifdim\Yp>\Ymax \Ymax=\Yp \fi
  1876.  \ifdim\Yc<\Ymin \Ymin=\Yc \fi \ifdim\Yp<\Ymin \Ymin=\Yp \fi
  1877.  \ifdim\Xc>\Xmax \Xmax=\Xc \fi \ifdim\Xp>\Xmax \Xmax=\Xp \fi
  1878.  \ifdim\Xc<\Xmin \Xmin=\Xc \fi \ifdim\Xp<\Xmin \Xmin=\Xp \fi \fi
  1879.  \ifInvisible@\let\next@=\relax
  1880.  \else\ifdim 1\Direction<-2\K \let\next@=\straightv@
  1881.  \else\ifdim 1\Direction<\z@ \let\next@=\straighth@
  1882.  \else\ifdim 1\Direction<2\K \let\next@=\straightv@
  1883.  \else \let\next@=\straighth@ \fi\fi\fi\fi
  1884.  \checkoverlap@@ \next@
  1885.  \def\Cslidep@@{\noCslidep@@}\def\Cslidec@@{\noCslidec@@}%
  1886.  \def\Calong@@{\noCalong@@}\Creset@@}
  1887. \xydef@\straighth@{\setbox\z@=\hbox{%
  1888.  \A@=\wd\lastobjectbox@
  1889.  \B@=\dp\lastobjectbox@ \advance\B@\ht\lastobjectbox@
  1890.  \ifdim \A@=\z@ \count@@=\m@ne
  1891.  \else \dimen@=\sdX\dX \divide\dimen@\A@ \count@@=\dimen@ \fi
  1892.  \Spread@@
  1893.  \ifdim\dX>\z@ \advance\Xc-\wd\lastobjectbox@ \fi
  1894.  \dimen@=-\sdX\wd\lastobjectbox@
  1895.  \multiply\dimen@\K@dYdX \divide\dimen@\K
  1896.  \ifdim\dX>\z@ \advance\Yc\dimen@ \advance\Yc-\Leftness@\dimen@
  1897.  \else \advance\Yc\Leftness@\dimen@ \fi
  1898.  \dimen@=\wd\lastobjectbox@ \A@=\sdX\dX \advance\A@-\dimen@
  1899.  \B@=\sdX\dimen@ \multiply\B@\K@dYdX \divide\B@\K \advance\B@-\dY \B@=\sdY\B@
  1900.  \count@=\count@@ \advance\count@\m@ne
  1901.  \ifnum\z@<\count@ \divide\A@\count@ \divide\B@\count@ \fi
  1902.  \A@=-\sdX\A@ \B@=\sdY\B@ \wd\lastobjectbox@=\A@
  1903.  \kern\Xc \count@=\z@
  1904.  \loop@\ifnum\count@<\count@@ \advance\count@\@ne
  1905.  \raise\Yc\copy\lastobjectbox@ \advance\Yc\B@ \repeat@}%
  1906.  \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
  1907. \xydef@\straightv@{\setbox\z@=\vtop{%
  1908.  \A@=\wd\lastobjectbox@
  1909.  \B@=\dp\lastobjectbox@ \advance\B@\ht\lastobjectbox@
  1910.  \ifdim \B@=\z@ \count@@=\m@ne
  1911.  \else \dimen@=\sdY\dY \divide\dimen@\B@ \count@@=\dimen@ \fi
  1912.  \Spread@@
  1913.  \dimen@=\dp\lastobjectbox@ \advance\dimen@\ht\lastobjectbox@
  1914.  \B@=\sdY\dY \advance\B@-\dimen@
  1915.  \A@=\sdY\dimen@ \multiply\A@\K@dXdY \divide\A@\K \advance\A@-\dX
  1916.  \A@=\sdX\A@ \count@=\count@@ \advance\count@\m@ne
  1917.  \ifnum\z@<\count@ \divide\B@\count@ \divide\A@\count@ \fi
  1918.  \B@=\sdY\B@ \A@=\sdX\A@ \ht\lastobjectbox@=\B@ \dp\lastobjectbox@=\z@
  1919.  \ifdim\dY<\z@ 
  1920.  \advance\Yc\dimen@ \advance\Yc\Upness@\B@
  1921.  \else
  1922.  \advance\dimen@\Upness@\B@ \advance\Yc-\dimen@ \advance\Yc\B@
  1923.  \fi
  1924.  \advance\Yc\B@ 
  1925.  \ifdim\dX<\z@ \else \advance\Xc-\wd\lastobjectbox@ \fi
  1926.  \null \kern-\Yc \count@=\z@
  1927.  \loop@\ifnum\count@<\count@@ \advance\count@\@ne
  1928.  \nointerlineskip \moveright\Xc\copy\lastobjectbox@ \advance\Xc\A@
  1929.  \repeat@}%
  1930.  \ht\z@=\z@ \wd\z@=\z@ \dp\z@=\z@ {\Drop@@}}
  1931. \message{XY-pic loaded}\xyuncatcodes \endinput
  1932.